如何避免绑定到2个datacontext

时间:2014-02-03 12:20:57

标签: c# wpf user-controls dependency-properties

我的应用程序如下所示

enter image description here

黑色是我的MainWindow,红色是标签控件,黄色是UserControl。

UserControl定义了许多依赖项属性,它们绑定到DataContext(使用this.DataContext = this在MainWindow的代码中设置。)

要将我的UserControl绑定到与我的MainWindow相同的DataContext,在我的UserControl xaml中我有以下内容

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}"

这很好用,当我与UserControl进行交互时,由于双向绑定,它会更新我的MainWindow的属性,然后更新我的TabControl!

问题是,我的UserControl现在有一些额外的功能,因此,需要绑定到后面的UserControl代码(例如GUI的值)。

这就是我被困住的地方。我无法从我的UserControl绑定到后面的代码,因为我已经创建了一个DataContext。

我知道我可以使用WinForms方法,并用x命名每个控件:Name =“MyControl”like

MyControl.Text = "This value";

MyControl.DataContext = this;

Yeuk我想!!

我的问题是,这是唯一的方法,还是我仍然可以使用绑定。

2 个答案:

答案 0 :(得分:1)

您可以像RelativeSource Binding属性一样使用其他MainWindow来访问UserControl中定义的属性,在UserControl中尝试以下XAML }:

<TextBlock Text="{Binding UserControlProperty, RelativeSource={RelativeSource 
    AncestorType={x:Type YourXmlNamespacePrefix:YourUserControl}}}" />

显然,您需要将YourXmlNamespacePrefix:YourUserControl更新为有效的XML命名空间和控件类型才能使其生效。


要么说你应该在任何地方设置DataContext,或者更改任何属性。这是RelativeSource Binding ...您 需要设置任何DataContext才能使其正常工作。我以为你会知道,因为你已经在使用它。试试这个例子。

答案 1 :(得分:1)

首先,您不需要在UserControl上手动设置DataContextDataContext 可继承属性,因此除非您已明确设置 ,否则它将从其父级继承DataContext。

从您的UserControl中删除DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}"


现在,如果你想绑定到UserControl中某些控件的代码,你可以使用RelativeSource进行绑定,或者可以在控件上设置DataContext

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                                     AncestorType=UserControl}}"

如果控件可以在一个面板下聚合在一起,请在父面板上设置DataContext,说Grid和子控件将继承它:

<Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                            AncestorType=UserControl}}">
   ..Child Controls here will inherit DataContext
</Grid>

回答你的问题:

  

MyControl.DataContext = this; &lt; - 这可能吗

是的,就像我上面提到的那样。