Предоставление свойств внутреннего элемента управления для привязки в WPF

[Изменить]: Я сам придумал, как это сделать. Я разместил свое решение в надежде, что оно сэкономит кому-то еще несколько дней поиска в 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, поэтому хороший простой пример действительно поможет, если мне нужно идти именно по этому пути.

40
задан Dave Clemmer 15 January 2013 в 05:28
поделиться