[编辑]: 我自己找到了解决方法。我发布了我的解决方案,希望能为其他人节省几天的谷歌搜索时间。如果你是WPF大师,请看看我的解决方案,并让我知道是否有更好/更优雅/更有效的方法做到这一点。特别是,我想知道我不知道的东西...这个解决方案会在将来给我带来什么问题吗?问题实际上归结为公开内部控件属性。
问题: 我正在创建一些代码,用于自动生成一个基于XML文件的数据绑定GUI。我有一个xsd文件可以帮助我确定节点类型等。简单的键/值元素很容易处理。
当我分析此元素时:
<Key>value</Key>
我可以创建一个新的"KeyValueControl"并将DataContext
设置为该元素。这个KeyValueControl
被定义为一个UserControl
,并且只有一些简单的绑定操作。它适用于任何简单的XElement
。
这个控件内部的XAML代码如下:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
结果是一个带有元素名称标签和值文本框的行,我可以编辑它的值。现在,有时候我需要显示查找值而不是实际值。我想创建一个类似于上面的KeyValueControl但可以指定(基于文件中的信息)ItemsSource、DisplayMemberPath和ValueMemberPath的“KeyValueComboBox”。DisplayMemberPath和ValueMemberPath绑定与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]/>
在我的代码中,我会像这样做(假设该节点是一个“Thing”,需要显示一组“Thing”,以便用户可以选择ID):
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
那么我的问题是:
1)我应该从 Control
还是 Selector
继承我的 KeyValueComboBox
?
2)如果我应该从 Control
继承,如何公开内部组合框的 ItemsSource
、DisplayMemberPath
和 ValueMemberPath
以供绑定?
3)如果我需要从 Selector 继承,可以有人提供一个小例子,说明我该如何入门?因为我对 WPF 还不熟悉,所以如果这是我需要采取的方法,一个漂亮简单的例子会真正有所帮助。