如何在 Windows 8 商店应用程序中访问 Parent 的 DataContext

Posted

技术标签:

【中文标题】如何在 Windows 8 商店应用程序中访问 Parent 的 DataContext【英文标题】:How to access Parent's DataContext in Windows 8 store apps 【发布时间】:2013-02-28 06:48:34 【问题描述】:

这是基于 XAML 的应用程序 (WPF/Silverlight/WinRT) 中的常见情况。

WPF相关链接->WPF Databinding: How do I access the "parent" data context?

RelativeSourceAncestorTypeMode=FindAncestor 通常会在 WPF 中进行救援。

WinRT API 中缺少这两者。如何访问父母的(可能不是直接的)DataContext

(我知道TemplateBindingElementBinding 但两者都不适合主要用于DataTemplate)。

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题。想必这很常见??

这是一个可行的粗略解决方案:

将***元素的 Tag 属性绑定到 DataContext

<Grid Name="gridTop" Tag="Binding" />

在嵌套元素中通过ElementName绑定你想要的属性,即

Binding Tag.SomeProp, ElementName=gridTop

【讨论】:

好建议,但这是ElementBinding。它在DataTemplate 内不起作用。附加行为似乎是要走的路。 它确实在 DataTemplate 中工作 - 您正在绑定到(父)元素的标记,该标记具有对父 DataContext 的引用。我一直在 DataTemplate 元素内部使用它来绑定到*** DataContext。 您可以通过删除标签来简化此操作,直接使用数据上下文 Binding DataContext.SomeProp, ElementName=gridTop【参考方案2】:

有几种方法可以解决这个问题:

正如 Filip 指出的,ElementName 绑定是最常见的方法。

您可以遍历视觉树,直到找到父级。这就是 FindAcestor 在内部所做的。您可以将其修饰为易于重用的行为。

如果您使用视图模型,您可以使用消息而不是绑定,或者您可以将父上下文添加到每个子视图模型。

选择最佳解决方案将取决于您的具体情况。

【讨论】:

【参考方案3】:

ElementName 绑定仍然是可能的,并且可能适用于您的情况。否则,您需要实现附加行为。

【讨论】:

以上是关于如何在 Windows 8 商店应用程序中访问 Parent 的 DataContext的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 Windows 8.1 商店应用程序访问 HSQL 数据库吗?

如何将 Windows 商店中的 Windows Phone 应用程序(8.1 XAML)迁移到 8.1 Silverlight?

如何在 Windows 8 商店应用程序中正确添加图像 (C#/XAML)

Windows应用商店:禁用webView缩放

Windows 8 运行时(WinRT/Windows 应用商店应用程序/Windows 10 通用应用程序)与 Silverlight 和 WPF 相比如何? [关闭]

Windows 8.1商店应用的信用卡支付实现[关闭]