1

我同時擁有實際的用戶生成數據和依賴於它的數據(例如用於UniformGrid單元格的背景色在網格中指示dupe值,每次從網格的ObservableCollection觸發INotifyPropertyChanged時計算)。還有其他這樣的對象在模型中是相互依賴的。現在,當反序列化時,取決於模型類中對象的順序,一些依賴對象被正確更新,而另一些則不正確。 (我來自MFC編程,並且在加載文件並一次設置所有DDX控件後用於調用UpdateData()。)MV-VM:處理從XmlSerialized數據動態生成的模型數據的最佳方法是什麼

整個事情很容易在隨後的代碼中發生變化,並且感覺非常笨拙。這就像WPF的許多事情一樣:如果你想完成一項簡單的任務,那麼它很快就會完成。如果你想要特定的東西,它會比它應該更復雜。有沒有什麼好的做法來解決這個問題?

回答

1

看起來好像你的主要問題是關注的正確分離。 WPF & MVVM與Windows開發的更傳統方法完全不同。

首先,讓我們在這裏排序 - 這可能只是混淆術語,但我會提到它。

在MVVM中,模型不用於存儲數據。

可以使用來保存數據嗎?是。 應該用來保存數據嗎?編號

保持和轉換數據是視圖模型的工作。模型的工作是充當管道,它提取數據(即從存儲庫中檢索,或者控制與WCF服務的通信等)。如果你的模型持有數據,這意味着你的視圖將綁定到模型,這是錯誤的。

你說的一些數據也應該保存在視圖中。確定是否重複可以在視圖模型中確定,甚至可以在模型中確定(模型可以在商業規則和標誌數據通過時應用)。重複顯示的顏色是視圖責任 - 除非該顏色由業務規則確定,那麼您可以將其移至視圖模型。

您正在綁定到一個ObservableCollection,它推斷您正在使用類似於DataGrid的中繼器類型控件。在這種情況下,每行都不知道任何其他行。如果您從一行的數據對象中觸發屬性更改事件,則另一行將完全不知道該事件,因此無法根據這些更改更改它的呈現方式。在這種情況下,您必須以觀察者模式的方式調整相關行的數據。

當你有這樣的相互依賴關係時,將每個實際的數據對象包裝在另一個充當外觀的輕量級對象中是正常的,有些人把它稱爲每個數據對象具有視圖模型。例如,下面是一個簡單的Customer對象:

public class Customer 
{ 
    public string FirstName {get; set;} 

    public string Surname {get; set;} 
} 

正如你這些信息存儲在您的視圖模型中的ObservableCollection你可以用它:

public class CustomerWrapper 
{ 
    private Customer _customer; 
    public CustomerWrapper (Customer customer) 
    { 
     _customer = customer; 
    } 

    public bool HasRelation{get;set;} 

    public Customer Customer { get {return _customer;}} 
} 

現在,如果你想顯示你的客戶對象之間的相互依賴性,例如,如果他們是一個家庭的一部分,你可以簡單地設置HasRelation屬性一旦CustomerWrapper對象被創建:

var myCustomerList = GetMyCustomers(); 
foreach (var customer in myCustomerList) 
{ 
    myObservableCollection.Add(new CustomerWrapper(customer) 
    { 
     HasRelation = myCustomerList.Where(p => string.Equals(p.Surname, customer.Surname).Count() > 1) 
    }); 
} 

現在,當你將轉發器控件綁定到ObservableCollection時,可以使用HasRelation屬性來控制UI顏色等。

請記住,我保留這是一個人爲的例子,我保持簡單,我故意錯過了一些東西,以保持簡短。如果您的viewmodel訂閱了每個Customer對象的屬性更改事件,則可以根據需要更新CustomerWrapper對象。相互依賴性狀態不需要與存儲庫中的數據一起存儲,因爲每次顯示數據時都可以確定它。我省略的一件事是包裝名字和姓氏proeprties - 您可以爲它們放置一個包裝屬性,或者您可以簡單地使用XAML綁定中的路徑來深入到嵌套對象。

+0

好奇!我從[WPF應用程序框架](http://waf.codeplex.com/)的Writer示例中導出了我的應用程序。在這種情況下,如果我沒有完全錯誤,那麼包含數據的FlowDocument類就是模型的一部分。怎麼會這樣? – thomiel 2013-03-28 13:01:05

+0

@thomiel這僅僅是一個在CodePlex上託管的開源項目 - 託管它並不意味着它以任何方式被任何人驗證或認可,特別是微軟。就像我上面所說的那樣,你*可以*在模型中存儲數據,但是IMVHO和你不應該擁有豐富的經驗* - 從長遠來看,它會導致問題和惡臭的代碼。你將要面對的一個問題是,對MVVM模式的解釋有很多,很多人將它與MVC和MVP的方面混淆了。 – slugster 2013-03-29 03:21:49

+0

無賴! WAF似乎是瞭解這個概念的一個很好的實例,儘管它不是純粹的M-V-VM。我真的很想念一個像m-v-vm.org這樣的領域,所有這些哲學家都會見面討論,創造類似RFC的結果......你不會順便說一句。恰好有一些網址準備好了,可以將我引向高性能和硬核MVVMing的神殿?在與WAF卡在一起之前,我開始與Laurent Bugnion和Josh Smith合作。 – thomiel 2013-03-29 12:03:59

相關問題