2011-04-27 73 views
3

我在棱鏡documentation中找到了該文本。我從MVVM開始,我迷路了。我可以(應該)在視圖中綁定模型屬性,或者我必須爲模型中的每個屬性創建一個包含代理屬性的視圖模型?直接在視圖中綁定模型屬性

模型類通常提供 財產和收集變化 通知通過 INotifyPropertyChanged的和事件 INotifyCollectionChanged接口。 這使得他們可以很容易地在視圖中綁定數據 。 表示對象集合 的模型類通常來自 ObservableCollection類。

編輯:這裏有一些額外的信息來幫助。我從頭開始構建個人項目(所以我也在設計模型),這是我第一次使用MVVM,並且我想要正確地學習。

我的模型是非常層次的,有更多類的列表,裏面有更多列表,構建一個複雜的信息樹。我正在嘗試「標準」MVVM方法,使用POCO構建模型並且沒有通知,並使用List。然後用適當的通知並使用ObservableCollections構建ViewModel。

問題是,它的方式,我幾乎重建我的整個模型作爲ViewModel AND必須保持之間的數據同步(ObservableCollection到列表)。然後我閱讀了Prism文檔,並想知道是否應該有所有這些麻煩,或者只是創建一個用於邏輯的根視圖模型,並將所有其他模型綁定到模型本身。

回答

3

實際上,如果您的模型已經實現INotifyPropertyChanged和/或IError信息,您可能希望將其綁定到模型屬性。但是,如果你想做特殊驗證和其他模型一無所知的東西,請在視圖模型中添加屬性包裝器。

本文給出了一種混合的一個很好的例子:很正常http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

通常我的MV屬性看起來像這樣和多數民衆:

public string Symbol 
    { 
     get { return Model.Symbol; } 
     set { Model.Symbol = value; this.NotifyOfPropertyChange(() => this.Symbol); } 
    } 

我常常不執行INotifyPropertyChanged模型,因此經常我必須寫封裝。

編輯:回覆您的其他信息:保持同步收藏和列表可能有點棘手。在你的情況下,我會做的是爲每個模型類創建一個視圖模型,但不包裝所有的屬性只是像這樣訪問它們:{Bindng Customer.Name}。但是,當然你必須爲包含視圖模型的集合創建一個包裝器。 Prism文檔正如他們自己所說的那樣,只是指導,如果您的場景需要不同的方法,那麼這很好。

看看這段代碼。我只包裝我將通過模型訪問的集合和屬性。這給你兩全其美。如果你需要一個不屬於你的模型的特殊屬性,你可以將它添加到視圖模型中(請參閱CustomerViewModel),或者如果你需要特定的屬性通知。

class CompanyViewModel{ 
    public CopanyViewModel(Company c){ 
    foreach(var customer in c.Customers) 
     Customers.Add(new CustomerViewModel(customer); 
    } 
    public Company Company {get;set;} 
    public ObservableCollection<CustomerViewModel> Customers {get;set;} 
} 

class CustomerViewModel{ 
    public CustomerViewModel(Customer c){ 
    Customer = c; 
    } 
    public Customer Customer {get;set;} 

    public Brush CustomerBackground{ 
    get{ 
     if(Customer.Active) 
      return Brush.Greeen; 
     else 
      return Brush.Red; 
    } 
    } 
} 

(此代碼可能無法正常工作,我只是鍵入它在這裏。)現在

,如果你需要更改的通知適用於所有型號,你必須在你的模型要麼實現它所有的屬性或包裝視圖模型中的所有屬性。

+0

我編輯了我的問題,添加了關於我手頭項目的更多信息,以及爲什麼我提出了這個問題。 – 2011-04-27 23:32:33

+0

嘿,我研究了一些,我想我最終達成了我的要求。我將在我的模型中使用IDataErrorInfo,INotifyPropertyChanged和ObservableCollection。他們不是WPF特有的,他們將解決幾乎所有的問題。 – 2011-04-29 11:31:58

+0

是的,它們位於System.ComponentModel命名空間中,它應該用於創建域模型(這就是爲什麼Collection 是例如沒有List ,因爲你的模型應該公開Collection而不是列表等)。無論如何,你會發現很多有趣的事情。有時你不能將INorifyChanged添加到你的模型中,原因很多,但在你的情況下,這可能是有道理的。另外請確保你使用類似這樣的改變通知:http://csharperimage.jeremylikness.com/2010/06/tips-and-tricks-for-inotifypropertychan.html。使重構更容易。 – lukebuehler 2011-04-29 14:56:10

相關問題