[Изменить]: Я сам придумал, как это сделать. Я разместил свое решение в надежде, что оно сэкономит кому-то еще несколько дней поиска в 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. Привязки Name и 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, как мне открыть доступ к ItemsSource внутреннего поля со списком, DisplayMemberPath и ValueMemberPath для привязки?
3) Если мне нужно наследовать от Selector, может ли кто-нибудь привести небольшой пример того, как я могу начать с этого? Опять же, я новичок в WPF, поэтому хороший простой пример действительно поможет, если мне нужно идти именно по этому пути.