我的主控件中嵌入了一个子控件,它允许用户编辑一个地址。因为这可以在所有地方重复使用(有时在一个控件上的多个位置),我会像这样绑定它
<Controls:EditAddressUserControl DataContext="{Binding Path=HomeAddress}"/>
<Controls:EditAddressUserControl DataContext="{Binding Path=WorkAddress}"/>
但是EditAddressUserControl需要访问主控件的CountrySummary对象列表,以便它可以选择地址所属的国家/地区。
我已将一个States DependencyProperty添加到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}" />
我在输出框中看到没有绑定错误,但我在组合框中也没有看到任何项目。
答案 0 :(得分:1)
您可以使用RelativeSource作为绑定源而不是DataContext来完成此操作。
这很可能看起来像:
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:EditAddressUserControl}}, Path=Countries}" />
答案 1 :(得分:1)
这样做的方法是完全停止使用DataContext。相反,我在我的控件中添加了DependencyProperty
public static DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(EditPostalAddressDto), typeof(EditPostalAddressControl));
然后在父控件中而不是设置DataContext =“...”我设置Address =“...” - 然后更改控件的XAML以在绑定上包含ElementName
<UserControl ..... x:Name="MainControl">
<TextBox Text="{Binding ElementName=MainControl,Path=Address.Region}"/>
现在我可以专门绑定到Address属性,但也绑定到主数据上下文的属性。