代码之家  ›  专栏  ›  技术社区  ›  Peter Morris

如何将数据绑定到控件的属性而不是DataContext?

  •  1
  • Peter Morris  · 技术社区  · 14 年前

    我的主控件中嵌入了一个子控件,它允许用户编辑地址。因为它在所有地方都被重用(有时在一个控件的多个地方),所以我这样绑定它

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

    但EditAddressUserControl需要访问主控件的CountrySummary对象列表,以便它可以选择地址属于哪个国家。

    我已向EditAddressUserControl添加了一个国家/地区依赖属性,并添加了

    Countries="{Binding Countries}"
    

    到目前为止一切都进展顺利,EditAddressUserControl.Countries属性中包含正确的国家。但是,如何将ComboBox.itemsSource数据绑定到XAML中的ComboBox.itemsSource?

    我仍然希望EditAddressUserControl上的所有内容都绑定到其DataContext,但ComboxCountries.itemsSource需要绑定到“this.countries”。

    我该怎么做?

    我试过了

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

    我在输出框中没有看到绑定错误,但在组合框中也没有看到任何项。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Reed Copsey    14 年前

    您可以通过使用 RelativeSource 对于绑定源,而不是DataContext。

    这很可能看起来像:

    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:EditAddressUserControl}}, Path=Countries}" />
    
        2
  •  1
  •   Peter Morris    14 年前

    这样做的方法是完全停止使用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}"/>
    

    现在我可以专门绑定到地址属性,也可以绑定到主数据上下文上的属性。