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

8

我看到有人建议使用Messenger/EventAggregator在“当前”目标更改时向ViewModel传递参数,但在我的情况下不起作用。

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

class CustomerViewModel
{
    CustomerViewModel(int customerId) {}
}

同时在应用程序外壳中有相同类型的视图。

  1. 对于每个视图,都有一个唯一的CustomerViewModel实例。 每个CustomerViewModel实例可以具有不同的customerId。(这类似于Visual Studio IDE,在同一时间打开多个文档)
  2. 我不想在View类中编写诸如“this.DataContext = new CustomerViewModel(id)”之类的代码。 如何使用MVVM处理此类情况?

谢谢。


回答你的问题,“EventAggregator”是在“MVVM”中实现它的方式。为什么你不能使用它?有任何原因吗? - Rohit Vats
@RV1987 我不能使用EventAggregator,因为我想在创建ViewModel时获取参数。 - Chen
我认为你需要使用ViewModelLocator来创建一个ViewModel对象,这样我们就可以在整个应用程序中使用同一个对象。 - Dhaval Patel
1个回答

1

有几种方法可以处理这种情况,首先 - 决定您是使用View first or View Model first方法。

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

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

我应该指出,如果您正在使用某种类型的DI,则始终可以将该参数注入ViewModel中。在Unity中,我IRC可以比在MEF中更容易地完成这项工作(您只需注册该值,然后创建依赖于该类型的ViewModel)。


我认为Initialize()方法适合我的情况。IIRC是什么?你是说使用ResolveOverrides吗? - Chen
IIRC 是 "If I Remember Correctly" 的缩写(抱歉:)。我检查了一下,这在 Unity 中可以相当容易地完成,使用 RegisterInstance(或 RegisterType)并 Resolve 需要该类型的 ViewModel。 - Blachshma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接