2010-05-06 55 views
2

我正在使用Prism来创建一个新的应用程序。有几个查找列表将在应用程序的几个地方使用。因此,有必要定义一次,并在需要该功能的任何地方使用该功能。我目前的解决方案是使用类型化数据模板来呈现内容控件中的控件。MVVM模式和嵌套视图模型 - 通信和查找列表

<DataTemplate DataType={x:Type ListOfCountriesViewModel}> 
     <ComboBox ItemsSource={Binding Countries} SelectedItem="{Binding SelectedCountry"/>  </DataTemplate> 
    <DataTemplate DataType={x:Type ListOfRegionsViewModel}> 
     <ComboBox ItemsSource={Binding Countries} SelectedItem={Binding SelectedRegion} /> </DataTemplate> 

    public class ParentViewModel 
    { 
     SelectedCountry get; set; 
     SelectedRegion get; set; 
     ListOfCountriesViewModel CountriesVM; 
     ListOfRegionsViewModel RgnsVM; 
    } 

然后在我的窗口,我有2个内容控件和控件的其余

<ContentControl Content="{Binding CountriesVM}"></ContentControl> 
<ContentControl Content="{Binding RgnsVM}"></ContentControl> 
<Rest of controls on view> 

在我有这个工作,并为组合框的SelectedItems通过EventAggregator从publising事件的时刻然后在父视图模型中订阅的子视图模型。

我不确定这是最好的方式,因为我可以想象我会很快结束很多事件,它将变得笨拙。另外,如果我要在另一个窗口上使用相同的视图模型,它将发布该事件,并且此父视图模型已订阅该模型,这可能会产生意想不到的后果。

我的问题是: -

  1. 这是把查找列表在各种屏幕上可重复使用的视图的最佳方式?
  2. 如何使其绑定到子视图模型的组合框在父视图模型上设置相关属性而不使用事件/介体。例如在这种情况下,SelectedCountry例如?
  3. 我想要做什么的替代实施建议?

我有一种感觉,我失去了一些东西明显,有这么多的信息,很难知道什么是正确的所以任何帮助将是非常感激地接受。

回答

3

在你的情况下,似乎父母知道孩子的类型。你不能在这种情况下使用属性吗? :

ListOfCountriesVM公开SelectedCountry的属性。

在父VM中,SelectedCountry的实现只是返回ListOfCountriesVM.SelectedCountry。

您可以为任何知道它拥有ListOfCountriesVM的父视图模型执行此操作。

根据我的经验,消息/事件聚合应该只用于发布商不关心谁在监听或者有多少监听器的场景。例如:

  1. 将通知发送给其他模块的应用
  2. 发送通知,查看你不能保证存在于同一模块中的模型。

在您的情况下,订阅者(父)已经知道出版者(孩子)是谁,所以使用属性的简单解决方案似乎是最合适的。我认为这种特殊情况不需要基于消息或基于事件的解决方案。