如何在 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?
RelativeSource
与 AncestorType
和 Mode=FindAncestor
通常会在 WPF 中进行救援。
WinRT API 中缺少这两者。如何访问父母的(可能不是直接的)DataContext
?
(我知道TemplateBinding
和ElementBinding
但两者都不适合主要用于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 8 运行时(WinRT/Windows 应用商店应用程序/Windows 10 通用应用程序)与 Silverlight 和 WPF 相比如何? [关闭]