在Silverlight视图之间传递模型

时间:2011-09-22 11:52:57

标签: silverlight prism

由于Silverlight中的基本导航机制只允许在查询字符串中传递参数,因此当我们想要在视图之间传递复杂数据(例如模型)时,我们使用IEventAggregator的pub \ sub机制。

但问题是 - 是否有更好的方法在视图之间传递复杂信息? 使用IEventAggregator的缺点是什么?

3 个答案:

答案 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>();

然后,您可以将模型置于“会话”中,直到应用程序关闭。