【发布时间】:2019-07-11 00:48:00
【问题描述】:
我有 MainWindow(为清楚起见进行了简化):
<Window>
<!-- (...) -->
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<!-- (...) -->
<CheckBox IsChecked="{Binding ShowAdvanced}" Content="Advanced view" />
<uc:MyUserControl DataContext={Binding MyUserControlViewModel} />
</Window>
MainWindowViewModel:
public partial class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
MyUserControlVM = new MyUserControlViewModel();
}
private bool _showAdvanced;
public bool ShowAdvanced
{
get => _showAdvanced;
set { _showAdvanced = value; NotifyPropertyChanged(); }
}
private MyUserControlViewModel _myUserControlVM;
public MyUserControlViewModel MyUserControlVM
{
get => _myUserControlVM;
set { _myUserControlVM= value; NotifyPropertyChanged(); }
}
}
在我的 UserControl 中,当未选中“显示高级”复选框时,我应该隐藏一些控件。
<GroupBox Header="Some advanced stuff"
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.(vm:MainWindowViewModel.ShowAdvanced), Converter={StaticResource BoolToVis}}">
<!-- (...) -->
</GroupBox>
这确实有效,但我不喜欢这样,因为 UserControl 依赖于 MainWindow。
如何在没有 DependencyProperty 的情况下正确连接这些视图模型?
我已尝试将此添加到 MyUserControlViewModel:
public MyUserControlViewModel(MainWindowViewModel parent)
{
Parent = parent;
}
private MainWindowViewModel _parent;
public MainWindowViewModel Parent
{
get { return _parent; }
set { _parent = value; NotifyPropertyChanged(); }
}
并在 MyUserControl 控件之一上绑定可见性,如下所示:
Visibility="{Binding Parent.ShowAdvanced}"
但这不起作用(MyUserControl 没有收到通知?)。
【问题讨论】:
-
通常情况下,通过这样的路径绑定可以正常工作。我刚刚编写了一个超级简单的示例,它按预期更新了更改。所以你的初始化有问题,可能在某处使用了错误的视图模型实例。您需要解决您的问题,以便它包含一个良好的 minimal reproducible example 可靠地重现问题。
-
ShowAdvanced应该是MyUserControlViewModel的属性 -
@PeterDuniho 正如我所写 - 我在 XAML 中与 Path 的绑定有效。我想从我的视图中摆脱它(并将这种关系移动到视图模型。
-
@SirRufo:这里的重点是他的
UserControl视图模型将该属性委托给定义该属性的主视图模型类。MyUserControlViewModel具有Parent属性,绑定路径应该通过该属性找到主视图模型的ShowAdvanced属性。 -
@PeterDuniho 我知道,但我建议属性应该属于控制VM
标签: wpf mvvm parent-child viewmodel