我正在努力理解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倡导者使用该方法的原因。