繁体   English   中英

WPF:是否可以绑定到userControl属性的父级并将其DataContext设置为视图模型?

[英]WPF: Is it possible to bind to a parent on userControl property and set its DataContext to a viewmodel?

我被困了一会儿,直到我发现为什么事情不起作用。 我正在基于Connected的值(这是SetupViewModel(parent)的一个属性)更改两个不同UserControl上的可见性。 这些用户控件之一也将其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}" />

这是父级ViewModel。 仅显示相关绑定。

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或绑定,因此我无法使其正常运行。

非常感激任何的帮助。

您总是可以这样绑定到控件的Parent元素的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}"
    .../>

绑定的另一种选择是嵌套控件。

<UserControl Visibility="{Binding Connected, Mode=OneWay, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" >

    <userControls:SessionSetupUserControl x:Name="SessionSetupUserControl" 
        DataContext="{Binding SessionSetupViewModel}" />

</UserControl>

这样,外部泛型“ UserControl”直接与其自身绑定,并且可以根据您的转换器可见/隐藏/折叠。

然后将内部用户控件专门绑定到SessionSetupViewModel的数据上下文

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

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

调试时请注意Visual Studio的输出日志,您肯定会看到绑定错误,这几乎说明了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM