【问题标题】:How to access Parent's DataContext in Windows 8 store apps如何在 Windows 8 商店应用程序中访问 Parent 的 DataContext
【发布时间】: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)。

【问题讨论】:

    标签: wpf xaml windows-8 windows-runtime winrt-xaml


    【解决方案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 绑定仍然是可能的,并且可能适用于您的情况。否则,您需要实现附加行为。

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        相关资源
        最近更新 更多