我无法弄清楚如何从其他视图或视图模型向我的viewmodel传递参数。
例如,我有一个名为Customers的视图。内部有一个网格,如果双击网格,则应该出现一个新视图,允许您编辑该客户的数据。但是,负责编辑数据的View(模型)如何知道如果我不能传递任何参数,它应该打开哪个客户?
EventAggregator是不可能的,因为我显然无法为一个视图创建数百个事件标记。此外,这是一个糟糕的解决方案。
到目前为止,我能够提出:
CustomerDataView custView = new CustomerDataView(customerId, currentContext);
manager.Regions[RegionNames.Sidebar].AddAndActivate(custView);
您对此特定解决方案有何看法?这是通常的方式吗? 我不喜欢这样的事实是我失去了Unity的自动依赖注入。
答案 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);
}