2012-01-15 24 views
0

我有一個WPF DataGrid顯示產品。我有兩個字段的價格和質量,實際上是Product類的屬性。我需要在網格名稱MultipliedValue = price * mass中顯示一個單獨的列。根據MVVM模型,我應該在哪裏做?計算列應該在MVVM模型中的哪個位置?

1)在模型中通過只讀屬性。

2)在轉換器,以便只有我的用戶界面會意識到這一點?

3)或在View模型中?

請提出我應該選擇哪個選項,爲什麼?

謝謝。

回答

3

我會忽略選項#2從開始 - 轉換器應該只用於說明UI的實現細節,特別是在MVVM中,甚至可能不是那樣(因爲您可以在ViewModel中進行轉換,選項#3,更方便)。

在#1和#3之間,在這種情況下,恕我直言,最好用#1 - 價格不是隻與您的用戶界面相關的東西,當然價格的概念(以及它是如何派生的)在整個應用程序中保持固定。用戶界面和後端都可以選擇使用此屬性。

+0

嗯..感謝您解決我的困惑。 – 2012-01-15 13:49:58

3

我會爭辯不同(比@jon)。我只在模型中放入了我想序列化的屬性(例如,從服務器)。計算屬性不會序列化,因此它們不在模型中。

最近,我最喜歡的Model/View Model範例如下:Product是Model中的一個類,它除了最簡單的getter和setter之外都沒有。 ProductVm是虛擬機中的一個類,它包含Product,並具有額外的VM邏輯。最重要的是,財產改變了通知 - 我認爲這也是虛擬機的一部分,而不是模型。

// Model: 
class Product { 
    public double Price { get; set; } 
    public double Mass { get; set; } 
} 

// View Model: 
class ProductVM : INotifyPropertyChanged 
{ 
    Product _product; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public double Price { 
     get { return _product.Price; } 
     set { _product.Price = value; raise("Price"); raise("Total"); } 
    } 

    public double Mass { 
     get { return _product.Mass; } 
     set { _product.Mass = value; raise("Mass"); raise("Total"); } 
    } 

    public double total { 
     get { return Price * Mass; } 
    } 

    private void raise(string name) { 
     if(PropertyChanged) { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    public ProductVm(Product p) { 
     _product = p; 
    } 

    public ProductVm() { 
     // in case you need this 
     _product = new Product(); 
    } 
} 

是的,有很多的樣板這裏,但一旦你做所有的打字,你會發現模型和視圖模型非常有用之間的這種分離。我的2美分。

注意:我認爲@Jon方法也是正確的,並且是有原因的。我不認爲有一個答案。

+1

通過使用您的設計,模型中定義的屬性將主要在ViewModel中重新定義。另外,您在ViewModel中定義了業務規則,但不是Model。這似乎與MVVM模式相矛盾。不過,你的設計似乎也很有趣。 – 2013-01-22 08:21:52

+0

我不同意這種設計。您已將業務邏輯(總計字段)放入作爲應用程序層一部分的視圖模型中。另外我不明白你爲什麼沒有在模型上實現** INotifyPropertyChanged **,因爲它使所有事情變得更容易。 – 2015-07-31 11:24:43

+0

謝謝@HosseinShahdoost。我會解釋一下:關於INotifyPropertyChanged不在模式中:這很簡單。我們希望保持模型的清潔和儘可能獨立。例如 - 該模型是我們序列化通過電線發送的。它應該始終只包含數據,並且可能(每種方式都有很多爭論)數據的驗證邏輯。至於Total字段,我會問你:MVVM應用程序中的應用程序層是什麼?這是觀點嗎?是模型(再次,你會序列化總數)? – Uri 2015-07-31 12:38:53

相關問題