如何在WPF应用程序中将参数传递给ViewModel的构造函数?

Che*_*hen 7 c# wpf prism mvvm

我看到人们建议使用Messenger/EventAggregator在"当前"目标更改时将参数传递给ViewModel,但它对我的情况不起作用.

假设我有一个像这样的ViewModel类:

class CustomerViewModel
{
    CustomerViewModel(int customerId) {}
}
Run Code Online (Sandbox Code Playgroud)

和:

  1. 我同时在应用程序shell中有相同类型的视图.
  2. 对于每个视图,都有一个唯一的CustomerViewModel实例.每个CustomerViewModel实例可以具有不同的customerId.(类似于Visual Studio IDE,同时打开多个文档)

我不想在我的View类中编写类似"this.DataContext = new CustomerViewModel(id)"的代码.什么是MVVM处理这种情况的方式?

谢谢.

Bla*_*hma 1

有几种方法可以处理这种情况,首先 - 决定您使用的是视图优先还是视图模型优先方法。

使用 EventAggregator 是一个有效的选项。

另一种选择是让 ViewModel 实现一个接口,然后使用一些IoC/DI(例如MEF或 Unity)来获取 ViewModel 的实例。使用此方法,您可以定义一个Initalize(int Id)您知道 ViewModel 必须实现的函数。您不需要视图知道 CustomerViewModel 类,只需知道接口即可。

我应该注意,如果您使用某种DI,您始终可以将该参数注入到 ViewModel 中。在 Unity 中的 IIRC 比在 MEF 中更容易完成(您只需注册该值,然后创建依赖于该类型的 ViewModel)。