我正在使用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发布事件,然后在父视图模型中订阅。
我不确定这是最好的方式,因为我可以想象我会很快结束很多事件而且会变得笨拙。此外,如果我要在另一个窗口上使用相同的视图模型,它将发布该事件,并且此父视图模型已订阅它,这可能会产生意想不到的后果。
我的问题是: -
我有一种感觉,我错过了一些明显的东西,而且有太多的信息很难知道什么是正确的,所以任何帮助都会非常感激。
答案 0 :(得分:3)
在您的方案中,似乎父母知道孩子的类型。你不能在这种情况下使用属性吗? :
ListOfCountriesVM公开了SelectedCountry的属性。
在父虚拟机中,SelectedCountry的实现只返回ListOfCountriesVM.SelectedCountry。
您可以为任何知道它拥有ListOfCountriesVM的父视图模型执行此操作。
根据我的经验,消息/事件聚合应该只用于发布者不关心谁在听或有多少听众的情况。例如:
在您的情况下,订阅者(父母)已经知道发布者(孩子)是谁,因此使用属性的简单解决方案似乎是最合适的。我不认为这种特定情况需要基于消息传递或基于事件的解决方案。