View如何知道在WPF中使用什么ViewModel?

Bob*_*ob. 24 c# wpf mvvm

有人可以解释View和ViewModel是如何连接的吗?我找不到引用ViewModel的View的xaml或xaml.cs,也没有找到引用View的ViewModel.cs文件中的任何内容,但它们以某种方式连接,并且从ViewModel到View的绑定成员工作.

此外,在每个的构造函数中,只有View的InitializeComponent和ViewModel的基本构造函数(没有View的声明/定义).

谢谢!

Ree*_*sey 32

这里有各种选择.

有些东西必须将View设置DataContext为ViewModel的一个实例.这里有很多选择:

  • 这可以直接在xaml中完成(View直接实例化ViewModel).
  • 这可以在View的构造函数(this.DataContext = new MyViewModel();)中完成
  • 这可以通过一个 DataTemplate
  • "协调"类可以将这些连接在一起(即:单独的"演示者"类可以构造两者并进行DataContext适当的设置)

最常见的是让View在xaml中定义VM(View-first),或者以ViewModel为中心的观点,让WPF根据绑定的VM自动创建View(ViewModel-第一).

前一种方法是许多工具包使用的方法,例如MVVM Light.后一种方法是我在MVVM博客系列中使用的方法,并被其他一些工具包使用.


Dan*_*rod 5

将视图连接到视图模型的"干净"方式将是......

创建视图时,对于每个视图,将其DataSource设置为其视图模型:

例如

public class App
{
    private void OnAppStart()
    {
        var model = new MainModel();
        var vm = new MainVM();
        var view = new MainWindow();

        vm.Model = model;
        view.DataSource = vm;

        view.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

当您正在查看的模型发生更改时,请更新VM:

public class MainVM
{
    private void OnSelectedModelItemChanged()
    {
        this.SelectedItem = new ItemVM();
        this.SelectedItem.Model = this.SelectedModelItem;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用数据模板使视图为每个VM选择正确的子视图.