[英]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.