为usercontrol定义viewmodel的类型,然后从父控件处理它

时间:2013-04-11 15:38:39

标签: wpf mvvm

我试图绕过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的新实例。

我试图尽可能地提出这个问题。希望它仍然清楚 谷歌搜索出现了很多(竞争)方法,但我再也看不到树林了。

1 个答案:

答案 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倡导者使用该方法的原因。