我试图绕过WPF和MVVM。
在我的测试应用中,我有一个MainViewModel
属性ChildViewModel
类似地,我有一个实例化MainViewModel
的窗口,并且有一个应该收到MainViewModel.ChildViewModel
的子控件
对于我目前的应用程序,我有一个窗口(为了简洁而剪断)
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Window.Content>
<view:ChildView DataContext="ChildViewModel"/>
</Window.Content>
如何让ChildView用户控件定义它需要ChildViewModel类型的datacontext并接收它?
目前我通过设置它来创建它:
<UserControl.DataContext>
<vm:ChildViewModel>
</UserControl.DataContext>
但这会创建一个ChildViewModel的新实例。
我试图尽可能地提出这个问题。希望它仍然清楚 谷歌搜索出现了很多(竞争)方法,但我再也看不到树林了。
答案 0 :(得分:4)
您的UserControl
无需指定自己的ViewModel
- 您已经创建了一个并绑定了它。
话虽如此,您的绑定应指定为:
<view:ChildView DataContext="{Binding ChildViewModel}"/>
混淆可能源于MVVM有两种截然不同的方法。在Xaml的<DataContext>
标记内创建VM是一种“视图优先”方法 - View正在创建并实例化ViewModel。
您目前正在使用更多ViewModel-First方法(类似于my series on MVVM),其中ViewModel创建其他ViewModel,而VIew只是绑定它们。
就个人而言,我发现从代码的角度来看,VM-first更容易维护,而且通常更喜欢它。 View-first具有(可能)提供更好的设计时体验的优势,这就是许多MVVM倡导者使用该方法的原因。