将参数传递给ViewModels(Prism)

时间:2010-03-26 15:34:06

标签: c# silverlight mvvm prism viewmodel

我无法弄清楚如何从其他视图或视图模型向我的viewmodel传递参数。

例如,我有一个名为Customers的视图。内部有一个网格,如果双击网格,则应该出现一个新视图,允许您编辑该客户的数据。但是,负责编辑数据的View(模型)如何知道如果我不能传递任何参数,它应该打开哪个客户?

EventAggregator是不可能的,因为我显然无法为一个视图创建数百个事件标记。此外,这是一个糟糕的解决方案。

到目前为止,我能够提出:

CustomerDataView custView = new CustomerDataView(customerId, currentContext);
manager.Regions[RegionNames.Sidebar].AddAndActivate(custView);

您对此特定解决方案有何看法?这是通常的方式吗? 我不喜欢这样的事实是我失去了Unity的自动依赖注入。

2 个答案:

答案 0 :(得分:5)

或者,您可以将Unity升级到最新版本,该版本支持“参数覆盖”。

MyType mt = container.Resolve<MyType>(
                      new ParameterOverride("customerId", customerId));

这就是我所做的。我们发现子容器保留了对其父级的循环引用,并且无法正确收集(泄漏的内存),因此我们升级并选择使用此方法。

答案 1 :(得分:3)

这就是MV在MVVM中的用途。例如。客户网格和客户编辑器共享一个模型(由构造函数中的Unity注入)。当在网格中发生双击时,它将在模型中设置Customer实例。创建编辑器视图时,其viewmodel将从模型中获取Customer。

至于您提到的自动依赖注入的丢失,您可以使用CreateChildContainer()方法。 E.g:

using (var childContainer = _container.CreateChildContainer())
{
    childContainer.RegisterInstance(customerId);
    var custView = childContainer.Resolve<CustomerDataView>();
    manager.Regions[RegionNames.Sidebar].AddAndActivate(custView);
}