1

我正在尝试围绕 WPF 和 MVVM 进行思考。

在我的测试应用程序中,我有MainViewModel一个ChildViewModel属性。
同样,我有一个 Window 实例化 aMainViewModel并有一个应该接收的子控件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 的新实例。

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

4

1 回答 1

4

UserControl不需要指定它是自己的ViewModel- 您已经在创建并绑定它。

话虽如此,您的绑定应指定为:

<view:ChildView DataContext="{Binding ChildViewModel}"/>

混淆可能源于这样一个事实,即 MVVM 有两种截然不同的方法。在 Xaml 的<DataContext>标签中创建 VM 是一种“视图优先”的方法 - 视图正在创建和实例化 ViewModel。

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

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

于 2013-04-11T15:41:17.707 回答