2010-03-26 75 views
3

我无法弄清楚如何将参数从其他视图或视图模型传递给我的视图模型。将参数传递到ViewModels(棱镜)

例如,我有一个叫做Customers的View。里面有一个网格,如果你双击网格,一个新的视图应该出现,并允许你编辑该客户的数据。但如果我无法传递任何参数,View(Model)如何负责编辑数据,以知道应该打开哪个客户?

EventAggregator不存在问题,因为我显然无法创建数百个eventargs,每个视图都只有一个。此外,这是一个糟糕的解决方案。

到目前为止,我能想出:

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

你怎么看这个特定的解决方案?这是否正常完成? 我不喜欢这个事实,我失去了Unity的自动依赖注入。

回答

3

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

至于失去自动依赖注入,你提到你可以使用CreateChildContainer()方法。例如:

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

或者,您可以将Unity升级到支持“Parameter Overrides”的最新版本。

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

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

+0

当parameteroverride是一个自定义类实例时,代码不能正常工作,但如果它是一个字符串值或int值,代码工作正确。 – huoxudong125 2014-11-24 07:20:05