如何在父控件中绑定子用户控件的数据上下文

7
<TextBlock Text="{Binding ChildGroupName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True,Mode=TwoWay}"
TargetUpdated="OnTextUpdated"/> 

在这里,ChildGroupName 是一个子控件的数据上下文属性。我想将ChildGroupName的值绑定到父窗口。


分享更多的代码,这将有助于理解问题。 - Ayyappan Subramanian
2个回答

2

不能使用FindAncestor来绑定后代的数据...这个名字就是提示。如果子UserControl在与父级相同的XAML中定义,则可以为其提供一个名称,然后使用Binding.ElementName属性来绑定其属性:

<TextBlock Text="{Binding ChildPropertyName, ElementName=NameOfChildUserControl, 
    UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True, Mode=TwoWay}" 
    TargetUpdated="OnTextUpdated" />

0

Sheridan的解答对我没有用,因为ReSharper发出警告称“ChildPropertyName”是一个未知的属性。

我并没有真正尝试Sheridan的解决方案;也许它会起作用;也许WPF在幕后进行了一些聪明的技巧,即使使用Sheridan的方法也能够使事情正常工作;然而,对于我来说,所有的警告必须始终启用,并且所有的代码必须绝对没有警告,因此我不得不寻找一个既可以工作,又可以不引起ReSharper警告的解决方案。

对我有用的是添加DataContext.,如下所示(不包括额外的杂乱代码):

<TextBlock Text="{Binding DataContext.ChildPropertyName,
    ElementName=NameOfChildUserControl}" />

换句话说,当您使用ElementName时,DataContext变成了元素本身(这是有道理的),因此为了访问实际的视图模型,您需要首先引用元素的DataContext

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接