由于Silverlight中的基本导航机制只允许在查询字符串中传递参数,因此当我们想要在视图之间传递复杂数据(例如模型)时,我们使用IEventAggregator的pub \ sub机制。
但问题是 - 是否有更好的方法在视图之间传递复杂信息? 使用IEventAggregator的缺点是什么?
答案 0 :(得分:1)
这就是我切换到ViewModel第一种方法的原因。视图确实不可配置,也不应该真正传递ViewModels。对于我来说,ViewModel加载另一个ViewModel更为有意义:
Show.Screen<OrderDetailsViewModel>(vm => vm.OrderId = orderId);
这来自Build your own mvvm framework谈话,也与Caliburn Micro的工作方式类似。
答案 1 :(得分:0)
我不能告诉你为什么IEventAggregator不好,也许它不是那么直观?当你查看你的应用程序时 - 你想看看发生了什么,并且使用某些数据做事件似乎并不好。活动就是活动。您可以通过PRISM中的Region上下文共享一些数据。
我正在使用MEF解决同样的问题。所以,你可以定义像
这样的东西[Export]
public class MyModelService
{
// Code here whatever shared data you want
}
public class MyViewModel
{
// Import this shared ModelService
[Import]
public MyModelService ModelService
}
所以,如果你在ModelService中有一些数据 - 默认情况下,MEF只会组合一次(有效地使它共享),每次你在ViewModel中导入它时,这个实例都会存在。然后,您可以使用源自ModelService的事件来告知组件何时更新数据等。
答案 2 :(得分:0)
我目前正在使用Session的想法,就像在ASP.NET中一样。我已经定义了一个名为SilverlightSession的静态对象,并添加了Dictionary类型的Values属性。然后我只是添加到值字典或更新它并投射它
public static class SilverlightSession
{
public static Dictionary<string, object> Values { get; private set; }
}
在app.xaml.cs启动时:
SilverlightSession.Values = new Dictionary<string, object>();
然后,您可以将模型置于“会话”中,直到应用程序关闭。