【问题标题】:Binding UserControl property to parent data context将 UserControl 属性绑定到父数据上下文
【发布时间】:2017-03-05 21:32:27
【问题描述】:

我在 WPF MVVM 应用程序中有一个 UserControl,我想将其可见性绑定到其父级 DataContext 中的属性。问题是子 UC 有它自己的 DataContext。那么如何将子 DataContext 用于子 UC 的内部,而仍将父 DataContext 用于可见性呢?

例如,父控件的DataContext看起来像这样

class Parent
{
    public Child Child { get; private set; }

    public Visibility ChildVisible
    {
        get { return Visibility.Visible; }
    }
}

在 XAML 中,如何配置 Visibility 绑定以使其指向 Parent.ControlVisible,而不是 Child.ControlVisible?

<local:Child DataContext="{Binding Control}" Visibility="{Binding ControlVisible}" />

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    如何将子 DataContext 用于子 UC 的内部

    您不应设置UserControlDataContext(请参阅this)。因此,在您的子用户控件的绑定中使用RelativeResourceElementName。请注意,您可以在子 UserControl 中使用父级的 DataContext。

    另外,不要忘记为模型和/或视图模型实现INotifyPropertyChanged

    【讨论】:

    • 好消息。虽然在使用这种方法时可见性有效,但绑定仍然无法正常工作。在子网格上我使用了以下内容,但它似乎是指子,我认为是因为父子网格都是 UserControls。有没有办法确保它传给父母? DataContext="{Binding Path=PropName,RelativeSource={RelativeSource AncestorType=UserControl}}"
    • 使用AnsestorLevel=2绑定第二个用户控件。
    • 好的,这让我回到了父用户控件,但该属性实际上是在父视图模型(数据上下文)上。有没有办法告诉它绑定到父控件数据上下文的属性?
    • 我终于能够通过在子控件的网格上通过“DataContext”前缀属性名称来获得它,如下所示 。感谢您为我指明正确的方向。
    【解决方案2】:

    你可以通过ElementName引用父用户控件,并使用它的DataContext,例如

    <Border x:Name="parentControl" DataContext="{Binding Parent}" Visibility="Visible">
    
        <Border DataContext="{Binding Child}" Visibility="{Binding DataContext.MyVisibleProperty, ElementName=parentControl}">
    
        </Border>
    
    </Border>
    

    【讨论】:

    • 也许我遗漏了一些东西,但 ElementName 给了我 XAML 中的父 UserControl,而不是视图模型中的父 DataContext,对吧?
    • 你是对的。 Visibility="{Binding DataContext.Visibility, ElementName=parentControl}"> - 编辑了答案
    • 但这会将孩子的可见性设置为等于父母,这不是我想要做的。在这种情况下,父级始终可见。我只希望孩子的可见性由父数据上下文的属性确定。
    • 在我的示例中,父母和孩子都绑定到同一个属性,然后它们的可见性是相等的。改变了我的例子。
    • “DataContext”的前缀是我之前所缺少的。我能够将其用于您的方法,以及下面的方法。谢谢。
    猜你喜欢
    • 2016-03-15
    • 2013-01-20
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多