我的应用程序如下所示
黑色是我的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我想!!
我的问题是,这是唯一的方法,还是我仍然可以使用绑定。
答案 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上手动设置DataContext
。 DataContext
是 可继承属性,因此除非您已明确设置 ,否则它将从其父级继承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; - 这可能吗
是的,就像我上面提到的那样。