MVVM模式和嵌套视图模型 - 通信和查找列表

时间:2010-05-06 18:49:09

标签: wpf mvvm nested prism viewmodel

我正在使用Prism来创建我正在创建的新应用程序。有几个查找列表将在应用程序的多个位置使用。因此,定义它一次是有意义的,并在我需要该功能的任何地方使用它。我目前的解决方案是使用类型化数据模板来呈现内容控件中的控件。

   <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发布事件,然后在父视图模型中订阅。

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

我的问题是: -

  1. 这是将查找列表放在可以跨屏幕重复使用的视图中的最佳方法吗?
  2. 如何创建它以便绑定到子视图模型的组合框在父视图模型上设置相关属性而不使用事件/中介。例如在这种情况下是SelectedCountry?
  3. 我正在尝试做什么的其他任何实施建议?
  4. 我有一种感觉,我错过了一些明显的东西,而且有太多的信息很难知道什么是正确的,所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:3)

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

ListOfCountriesVM公开了SelectedCountry的属性。

在父虚拟机中,SelectedCountry的实现只返回ListOfCountriesVM.SelectedCountry。

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

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

  1. 向应用程序中的其他模块发送通知
  2. 发送通知以查看您无法保证的同一模块中的模型。
  3. 在您的情况下,订阅者(父母)已经知道发布者(孩子)是谁,因此使用属性的简单解决方案似乎是最合适的。我不认为这种特定情况需要基于消息传递或基于事件的解决方案。