具有持久订阅者行为的WPF / SL EventAggregator实现?

时间:2010-03-31 12:15:38

标签: wpf silverlight prism eventaggregator

目前我正在使用最新的Prism for Silverlight 4构建应用程序。 我有一个模块,在该模块中,我有两个视图模型视图。我还有一个模块视图,每个视图有两个区域。 在模块初始化中,我在Unity容器中注册我的视图和视图模型,并且还注册具有相应区域的视图。 问题是视图应该显示类似于表格详细信息的内容 - 第一个视图显示可用实体,第二个视图显示所选实体的详细信息。

我需要一种如何传递初始选定实体的方法。新创建的第一个视图没有任何选定的实体,新创建的第二个视图不显示任何细节。

目前我这样做: 在模块I中,创建两个视图模型并将它们注册为Unity容器中的实例,然后将视图注册为相应区域的类型。每个视图都从EventAggregator订阅EntitySelectedEvent。模块初始化程序在初始化后发布此事件,这样两个视图就选择了同一个实体。

我知道这看起来很难看 - 我尝试从一个视图模型发布此事件,但问题是Prism中的EventAggregator不支持持久订阅者 - 这意味着如果第二个视图模型没有订阅事件之前的事件第一个视图模型解雇它,它不会接收和事件。我知道这是EventAggregator的正常行为,但我正在寻找一个解决方案,当视图模型可以触发事件而不依赖于它们的初始化顺序 - 这是第一个模型可以在创建第二个模型之前触发事件和第二个模型订阅后会收到此“排队”事件。

是否有任何其他支持此类行为的WPF / SL消息传递实现或使用中介(在我的示例中它是模块本身)毕竟不是一个坏主意?调解器的一个大问题是必须在初始化时立即创建模型,并且它们不能在容器中注册为类型,因为这会再次导致缺少订户。

1 个答案:

答案 0 :(得分:0)

创建一个将由每个视图的ViewModels共享的模型。

在View 1中选择一行时,其ViewModel(通过绑定到选定行的CurrentEntity属性)将更新模型。

View 2的ViewModel将订阅Model的CurrentEntity的更改,并将正确更新它自己的CurrentEntity属性,这将导致它的View更新。