【问题标题】:WPF: Is it possible to bind to a parent on userControl property and set its DataContext to a viewmodel?WPF:是否可以绑定到 userControl 属性上的父级并将其 DataContext 设置为视图模型?
【发布时间】:2018-10-31 18:47:48
【问题描述】:

在我发现为什么事情不工作之前,我被困了一段时间。我正在根据 Connected 的值更改两个不同 UserControls 的可见性,Connected 是 SetupViewModel(parent) 上的一个属性。这些用户控件之一还将其 DataContext 设置为在 SetupViewModel 中创建的视图模型。但是在设置 DataContext 时,连接的绑定不起作用。


这就是我想要的工作方式

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" DataContext="{Binding SessionSetupViewModel}" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

但是当使用这个时,可见性值不会更新。


当我删除 DataContext 时,可见性开始更新。

<userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" />

这是父视图模型。只显示相关的绑定。

public class SetupViewModel : BindableBase
{
    private bool _connected;

    public SessionSetupViewModel SessionSetupViewModel { get; private set; }

    public bool Connected
    {
        get
        {
            return _connected;
        }
        private set
        {
            SetPropertyAndNotifyChanges(ref _connected, value);
        }
    }
}

我假设在解决可见性绑定时 UserControl 的 DataContext 已更改,但我不习惯使用 WPF 或绑定,因此我无法使其正常工作。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# wpf mvvm binding


    【解决方案1】:

    另一个绑定选项是嵌套控件...

    <UserControl Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" >
    
        <userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" 
            DataContext="{Binding SessionSetupViewModel}" />
    
    </UserControl>
    

    这样,外部通用“UserControl”直接绑定到自身,并且可以根据您的转换器显示/隐藏/折叠。

    然后内部用户控件具体绑定到SessionSetupViewModel的数据上下文

    【讨论】:

    • @Clemens 的回答很好而且正确。但是我将使用这个解决方案,因为它不会调用神秘的绑定魔法,这应该会使它更容易维护。对于那些不习惯 WPF 的人来说,这加上一个注释应该很容易解析。
    【解决方案2】:

    您始终可以像这样绑定到控件父元素的 DataContext 中的属性:

    Visibility="{Binding Parent.DataContext.Connected,
                         RelativeSource={RelativeSource Self},
                         Converter={StaticResource BoolToVis}}"
    

    但是,您可以考虑另一种设计,其中您的 UserControl 不直接绑定到显式分配的 DataContext。

    控件可以公开在实例化时绑定的依赖属性。因此它将独立于任何特定的视图模型。

    <userControls:SessionSetupUserControl
        Visibility="{Binding Connected, Converter={StaticResource BoolToVis}}"
        SomeProperty="{Binding SessionSetupViewModel.SomeVmProperty}"
        SomeOtherProperty="{Binding SessionSetupViewModel.SomeOtherVmProperty}"
        .../>
    

    【讨论】:

      【解决方案3】:

      由于您更改了 SessionSetupUserControl 实例的 DataContext,其他绑定正在尝试解析您分配的 DataContext。

      这意味着您的 Visibility 绑定正在 SessionSetupViewModel 上查找名为“Connected”的属性。

      调试时请注意 Visual Studio 输出日志,您一定会看到类似这样的绑定错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        相关资源
        最近更新 更多