2013-08-07 85 views
0

我是MVVM模式的新手,並且在項目上嘗試使用Caliburn.Micro。One ViewModel包含ViewModel的集合,根據ViewModel屬性的值不同視圖

我想有一個ViewModel(它包含一個ViewModel的集合)由多個視圖共享,其中每個視圖只顯示其中一個屬性具有特定值的項目。

具體而言,我使用的服務允許我監視經常更新的不同值。然後我得到一個MonitoredItem類型的對象,它包含一個DataValue類型的屬性,該屬性又包含一個Value的對象和一個值的數據類型的屬性。

到目前爲止,我有一個MonitoredItemViewModel使用這種服務的MonitoredItem類,因爲它的模型,其中包含BindableCollection<MonitoredItemViewModel> MonitoredItems,以及添加/刪除項目命令一個MonitoredItemsViewModel

我也有一個MonitoredItemsView我可以看到我目前監控的所有項目。

我該如何去分割視圖,以便我可以擁有所有MonitoredItems其中DataValue是在我的窗口中的一個區域中顯示的整數/浮點數/雙精度值,顯示在其他地方的布爾值等等?

回答

0

不要在視圖中執行此操作,而應在您的ViewModel上根據需要過濾的內容展示不同的集合。

這可以作爲已知集合來完成,例如,

public ObservableCollection<MonitoredItemViewModel> ItemsWhereFooIsBar ... 
public ObservableCollection<MonitoredItemViewModel> ItemsWhereFooIsntBar ... 

,或者你可以做到這一點更一般地按需返回過濾收集

public ObservableCollection<MonitoredItemViewModel> GetItems(Func<DataValue, bool> matches) 
{ 
    //Filter collection with 
    return ... allItems.Where(x=>matches(x))... ; 
} 

,並通過

GetItems(x=>x.Foo == Bar) 

打電話給你要的問題是,當項目發生變化,應該從收集切換到收集。如果您正在使用ReactiveUI這將是令人難以置信的容易,因爲你可以使用的Rx觸發其內置的項目跟蹤,還可以使用其.CreateDerivedCollection(...)自動建立新的集合(暗示,暗示:-))

如果沒有,那麼你有幾個選擇。

  • 可以派生從一個的ObservableCollection類,這樣,也可以通過CollectionChanged被通知當新的項目被添加或刪除,或當物品的性質發生變化,以及還得到通知。
  • 或者你可以讓你的ItemViewModel不可變,這樣它的屬性就不會改變,相反,你可以放棄舊的項目並將更新的項目添加到正確的集合中。
+1

我列出了ReactiveUI的一些替代方案[本答案](http://stackoverflow.com/questions/13780608#15035000)。 – HappyNomad

+0

感謝您解決我的問題的建議方式。我會試試這個 – Walkingsteak

+0

@HappyNomad謝謝,我會看看那些。很高興知道你不必每次都重新發明輪子 – AlSki

相關問題