这是基于XAML的应用程序(WPF/Silverlight/WinRT)中常见的情况。
WPF相关链接-> WPF数据绑定:如何访问"父"数据上下文?
RelativeSource
与AncestorType
、Mode=FindAncestor
通常在WPF中起拯救作用。
这两个在WinRT API中都是缺失的。如何访问父方的(可能不是直接的)DataContext
?
(我知道TemplateBinding
和ElementBinding
,但两者都不适合主要在DataTemplate)。
我刚刚遇到了同样的问题。想必这很常见吧??
这是一个粗略的解决方案:
-
将顶层元素的Tag属性绑定到DataContext
<Grid Name="gridTop" Tag="{Binding}" />
-
在嵌套元素中通过ElementName绑定你想要的属性,即
{Binding Tag.SomeProp, ElementName=gridTop}
ElementName绑定仍然是可能的,并且可能适用于您的情况。否则,您需要实现附加的行为。
有几种方法可以处理这个问题:
ElementName绑定是最常见的方法,正如philip指出的。
你可以走视觉树直到找到父节点。这就是FindAcestor在内部所做的。您可以用行为来修饰它,以便于重用。
如果你使用视图模型,你可以使用消息而不是绑定,或者你可以为每个子视图模型添加父上下文。
选择最佳解决方案取决于您的具体情况。