[編輯]:我想出瞭如何自己做到這一點。我發佈了我的解決方案,希望能在幾天的Google搜索中省去其他人。如果您是WPF大師,請查看我的解決方案,並告訴我是否有更好/更優雅/更高效的方式來執行此操作。特別是,我有興趣知道我不知道的是什麼......這個解決方案將如何讓我走上路?這個問題真的歸結爲暴露內部控制屬性。公開WPF中綁定的內部控件屬性
問題: 我正在創建一些代碼來爲WPF中的XML文件自動生成數據綁定GUI。我有一個xsd文件,可以幫助我確定節點類型等。簡單的鍵/值元素很容易。
當我分析這個元素:
<Key>value</Key>
我可以創造一個新的「KeyValueControl」,並設置DataContext
這個元素。 KeyValue被定義爲一個UserControl,並且只有一些簡單的綁定。它適用於任何簡單的XElement。
此控件中的XAML看起來是這樣的:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
結果是有該元素的名稱,並與我可以編輯值的文本框標籤的線。
現在,有些時候我需要顯示查找值而不是實際值。我想創建一個類似於上述KeyValueControl的'KeyValueComboBox',但能夠指定(根據文件中的信息)ItemsSource,Display和Value路徑。 「名稱」和「值」綁定將與KeyValueControl相同。
我不知道標準的用戶控件是否可以處理這個問題,或者如果我需要從Selector繼承。
的XAML的控制將是這個樣子:
<Label Content={Binding Path=Name} />
<ComboBox SelectedValue={Binding Path=Value}
ItemsSource={Binding [BOUND TO THE ItemsSource PROPERTY OF THIS CUSTOM CONTROL]
DisplayMemberPath={Binding [BOUND TO THE DisplayMemberPath OF THIS CUSTOM CONTROL]
SelectedValuePath={Binding [BOUND TO THE SelectedValuePath OF THIS CUSTOM CONTROL]/>
在我的代碼,然後,我會做這樣的事情(假設這個節點是一個「東西」,需要顯示的列表物聯網使用戶可以選擇ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
所以我的問題是:
1)我應該繼承控制或選擇我的KeyValueComboBox? 2)如果我應該從Control繼承,我如何公開內部組合框的ItemsSource,DisplayMemberPath和ValueMemberPath進行綁定? 3)如果我需要從Selector繼承,有人可以提供一個我可以如何開始使用它的小例子嗎?再說一遍,我是WPF的新手,所以如果這是我需要採取的道路,那麼一個很好的簡單示例將非常有用。
我使用了類似的技術,但運行到麻煩時,我的項目本身被設置爲使用RelativeSource綁定。所以在你的情況下,如果你指定了一個ComboBoxItem元素作爲你的ItemsSource的集合,並且通過使用RelativeSource綁定到FindAncestor來綁定到在該anscestor元素上定義的屬性,那麼綁定將失敗。 – jpierson 2010-12-15 04:31:58
我剛剛使用這個非常相似的情況下,很好的答案。在我的應用程序中,我綁定了Combobox的SelectedItem。應該指出的是,爲了使綁定正常工作,在某些情況下,有必要添加綁定Mode = twoway和UpdateSourceTrigger = PropertyChanged – Cocomico 2016-01-26 14:29:04