Как привязать данные к свойству элемента управления, а не к текстовому тексту? - PullRequest
1 голос
/ 01 февраля 2010

У меня есть подэлемент управления, встроенный в мой основной элемент управления, он позволяет пользователю редактировать адрес. Поскольку это повторно используется повсеместно (иногда в нескольких местах на одном элементе управления), я связываю это так

<Controls:EditAddressUserControl DataContext="{Binding Path=HomeAddress}"/>
<Controls:EditAddressUserControl DataContext="{Binding Path=WorkAddress}"/>

Но для EditAddressUserControl необходим доступ к списку основных элементов управления объектов CountrySummary, чтобы он мог выбирать, к какой стране принадлежит адрес.

Я добавил свойство зависимости от страны в EditAddressUserControl и добавил

Countries="{Binding Countries}"

Пока все идет хорошо, свойство EditAddressUserControl.Countries содержит правильные страны. Тем не менее, как мне привязать мой Combobox.ItemsSource к этому в XAML?

Я все еще хочу, чтобы все в моем EditAddressUserControl связывалось с его DataContext, но ComboBoxCountries.ItemsSource должен связываться с "this.Countries".

Как мне это сделать?

Я пробовал это

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:EditAddressUserControl}}, Path=Countries}" />

Я не видел ошибок привязки в поле вывода, но я также не видел элементов в выпадающем списке.

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Способ сделать это - полностью прекратить использование DataContext. Вместо этого я добавил DependencyProperty к своему элементу управления

public static DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(EditPostalAddressDto), typeof(EditPostalAddressControl));

Затем в родительском элементе управления вместо установки DataContext = "..." I set Address = "..." - XAML для элемента управления затем изменяется, чтобы включить ElementName в привязку

<UserControl ..... x:Name="MainControl">
<TextBox Text="{Binding ElementName=MainControl,Path=Address.Region}"/>

Теперь я могу специально привязывать к свойству Address, а также привязывать к свойствам в главном контексте данных.

1 голос
/ 01 февраля 2010

Это можно сделать с помощью RelativeSource для источника привязки вместо DataContext.

Скорее всего, это будет выглядеть примерно так:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:EditAddressUserControl}}, Path=Countries}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...