[Редактировать]: Я понял, как это сделать самостоятельно.Я разместил свое решение в надежде, что оно сэкономит кому-то еще несколько дней поиска в Google.Если вы гуру WPF, пожалуйста, посмотрите на мое решение и дайте мне знать, если есть лучший / более элегантный / более эффективный способ сделать это.В частности, мне интересно знать, чего я не знаю ... как это решение приведет меня в тупик?Проблема действительно сводится к раскрытию свойств внутреннего элемента управления.
Проблема: я создаю некоторый код для автоматической генерации привязанного к данным графического интерфейса пользователя в WPF для файла XML.У меня есть файл xsd, который может помочь мне определить типы узлов и т. Д. Простые элементы 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.Привязки «Имя» и «Значение» будут такими же, как и для 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]/>
В моем коде я бы затем сделал что-то вроде этого (предполагая, что этот узел является «вещью» и ему нужноотобразить список вещей, чтобы пользователь мог выбрать идентификатор:
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) Если мне нужно унаследовать от Selector, может ли кто-нибудь предоставить небольшой примеркак я могу начать с этим?Опять же, я новичок в WPF, поэтому хороший, простой пример действительно помог бы, если мне нужно идти по этому пути.