[Edit]: Я понял, как это сделать сам. Я отправил свое решение в надежде, что он спасет кого-то еще несколько дней в Интернете. Если вы являетесь гуру WPF, пожалуйста, посмотрите мое решение и сообщите мне, есть ли лучший/более элегантный/более эффективный способ сделать это. В частности, мне интересно узнать, чего я не знаю... как это решение будет меня загнать? Проблема действительно сводится к раскрытию внутренних свойств управления.
Проблема: Я создаю код для автоматического создания графического интерфейса, привязанного к данным, в WPF для XML файла. У меня есть файл xsd, который может помочь мне определить типы node и т.д. Простые элементы Key/Value легко.
Когда я разбираю этот элемент:
<Key>value</Key>
Я могу создать новый "KeyValueControl" и установить DataContext
для этого элемента. KeyValue определяется как UserControl и просто имеет некоторые простые привязки к нему. Он отлично работает для любого простого XElement.
XAML внутри этого элемента управления выглядит следующим образом:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
В результате получается строка с меткой с именем элемента и текстовым полем со значением, которое я могу редактировать.
Теперь, когда мне нужно отображать значения поиска вместо фактического значения. Я хотел бы создать "KeyValueComboBox", аналогичный описанному выше KeyValueControl, но иметь возможность указать (на основе информации в файле) пути ItemsSource, Display и Value. Связи "Name" и "Value" будут такими же, как KeyValueControl.
Я не знаю, может ли стандартный пользовательский элемент управления справиться с этим, или если мне нужно наследовать от Селектора.
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]/>
В моем коде я бы тогда сделал что-то вроде этого (предполагая, что этот node является "Thing" и ему нужно отобразить список вещей, чтобы пользователь мог выбрать ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
Итак, мои вопросы:
1) Должен ли я наследовать свой KeyValueComboBox от Control или Selector?
2) Если я должен унаследовать от Control, как я могу открыть внутренние элементы Combo Box ItemsSource, DisplayMemberPath и ValueMemberPath для привязки?
3) Если мне нужно наследовать от Селектора, может кто-нибудь дать небольшой пример того, как я мог бы начать с этого? Опять же, я новичок в WPF, поэтому хороший, простой пример действительно поможет, если мне дорога, которую мне нужно взять.