2014-10-22 67 views
2

我目前在EF(House,Room,Item)中有三種模型。不同DTO的viewmodels之間的MVVM通信

public class House 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<Room> Rooms { get; set; } 
} 

public class Room 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<Item> Items { get; set; } 
} 

public class Item 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
} 

在我的UI我有一個TreeView和一個顯示區域顯示的項目進行修改的詳細信息,當我雙擊在樹視圖中單擊某個項。

我的TreeView,以提高性能調用web服務返回以下DTO/s的

public class LayoutItemDTO 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<LayoutItemDTO> Children { get; set; } 
} 

這些DTO的映射使用查詢到的房子,房間,項目模型數據庫建立。

現在,當用戶雙擊樹形視圖上的房屋項目時,它會調用Web服務將帶有房間集合的房屋模型返回到用戶添加/刪除房間的視圖中,當它們關閉視圖時,它會提示保存。

當用戶雙擊房間時(即向房間添加/刪除項目),也會發生同樣的情況。

除了保持樹形視圖和打開的視圖不同步之外,這一切都很有效,所以如果它們改變了房間的名稱或添加/刪除了一個項目,我希望它在內存中的樹視圖中反射,並在它們取消更改時恢復關閉。

目前我已經完成了這個使用事件聚合器,但它似乎不整潔的調用每個動作的事件,如果我可以使用WPF綁定它會立即工作。

在樹形視圖中不使用相同模型的原因是由於這些模型在獲取所有導致性能問題的所有信息時比它們顯示的信息多得多。

回答

0

數據綁定和INotifyPropertyChanged的

如果您希望您的對象更改的UI使用數據綁定中反映出來,你要實現你的模型類INotifyPropertyChanged接口(或在視圖模型,如果你正在使用MVVM模式)。

通過實現接口,每次修改屬性值時都會觸發一個事件(PropertyChanged),並且控件的數據綁定屬性將刷新以顯示新值。

你可以在這裏找到一個例子:How to: Implement the INotifyPropertyChanged Interface

集合

對於集合,如果集合實現INotifyCollectionChanged WPF數據綁定將工作。 List<T>類型沒有實現這個接口,所以TreeView不會反映從列表中添加/刪除。 ObservableCollection<T>類型實現此接口,因此您只需將List<LayoutItemDTO>更改爲ObservableCollection<LayoutItemDTO>,並且應該反映更改。

MVVM

至於你提到使用MVVM,我想補充一點,我通常會在我的ViewModels ObservableCollectionINotifyPropertyChanged實現。您可能想要創建一個LayoutItemViewModel,它將封裝一個LayoutItemDTO

我還可以建議你看看現有的工具包和框架,這些工具包和框架可以幫助實現MVVM的「管道代碼」(如INotifyPropertyChanged實現)。我主要使用MVVM Light,但根據您的需求還有許多其他的功能。

這裏也是一個很好的鏈接,在MVVM方式實現TreeView的數據綁定:Simplifying the WPF TreeView by Using the ViewModel Pattern

+0

感謝你好了,我們確實有這些DTO的的ViewModels所以樹形視圖有layoutviewmodel的反應和看法時,這是開放的有houseviewmodel與嵌套視圖模型的房間和這些項目後,用戶已經雙擊樹視圖和第二次服務調用已建立。當我們在樹視圖中更改任何這些項目時,或者在它們後面具有不同視圖模型的打開視圖中時,問題就會起作用。我們需要一種方法來在兩者之間建立一個共同的相關視圖模型 – jclarkson 2014-10-28 15:36:49