为用户控件定义视图模型的类型,然后从父控件传递它



我正在努力理解WPF和MVVM。

在我的测试应用中,我有一个具有ChildViewModel属性的MainViewModel
同样,我有一个实例化MainViewModel的窗口,并有一个子控件,应该接收MainViewModel.ChildViewModel

对于我当前的应用程序,我有一个带有

的窗口。
<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>
<Window.Content>
    <view:ChildView DataContext="ChildViewModel"/>
</Window.Content>

我如何让我的ChildView用户控制定义,它需要类型的ChildViewModel的数据上下文,也接收它?

目前我是这样创建的:

<UserControl.DataContext>
    <vm:ChildViewModel>
</UserControl.DataContext>

但是这会创建一个ChildViewModel的新实例。

我尽量使这个问题简明扼要。希望还是很清楚
在谷歌上搜出了很多(有争议的)方法,但我再也看不到森林了。

你的UserControl不需要指定它自己的ViewModel -你已经创建了一个并绑定了它。

也就是说,你的绑定应该被指定为:
<view:ChildView DataContext="{Binding ChildViewModel}"/>

这种混淆可能源于有两种截然不同的MVVM方法这一事实。在Xaml的<DataContext>标签中创建VM是一种"视图优先"的方法——视图创建并实例化ViewModel。

您目前正在使用更多的ViewModel- first方法(类似于我在MVVM上的系列),其中ViewModel创建其他ViewModel, VIew只是绑定到它们。

就我个人而言,我发现从代码的角度来看VM-first更容易维护,并且通常更喜欢它。视图优先具有(潜在地)提供更好的设计时体验的优势,这就是为什么许多MVVM倡导者使用该方法的原因。

相关内容

最新更新