将参数传递到ViewModels(Prism)

3

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

例如,我有一个名为“客户”的视图。里面有一个网格,如果您双击该网格,应该会出现一个新视图,允许您编辑该客户的数据。但是,如果我无法传递任何参数,那么负责编辑数据的视图(模型)将如何知道它应该打开哪个客户?

事件聚合器不可行,因为我显然不能为每个视图创建数百个事件参数。而且,这是一个糟糕的解决方案。

到目前为止,我能想到的是:

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

您对这个特定解决方案有什么看法?这是通常的做法吗? 我不喜欢这个解决方案的原因是,我不能再使用Unity的自动依赖注入。

2个回答

5

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

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

这是我所做的事情。我们发现子容器对其父容器保持了循环引用,无法正确进行垃圾回收(内存泄漏),因此我们进行了升级并选择了这种方法。


当参数覆盖是自定义类实例时,代码无法正常工作,但如果它是字符串值或整数值,则代码可以正常工作。为什么? - huoxudong125

3

MVVM中的M代表什么?比如,有一个模型被客户网格和客户编辑器共享(在构造函数中由Unity注入)。当在网格中发生双击时,它会将Customer实例设置在该模型中。当创建编辑器视图时,其视图模型将从模型中获取Customer。

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

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

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