2010-05-06 61 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. 發送通知,查看你不能保證存在於同一模塊中的模型。

在您的情況下,訂閱者(父)已經知道出版者(孩子)是誰,所以使用屬性的簡單解決方案似乎是最合適的。我認爲這種特殊情況不需要基於消息或基於事件的解決方案。