我有一個WPF DataGrid顯示產品。我有兩個字段的價格和質量,實際上是Product類的屬性。我需要在網格名稱MultipliedValue = price * mass中顯示一個單獨的列。根據MVVM模型,我應該在哪裏做?計算列應該在MVVM模型中的哪個位置?
1)在模型中通過只讀屬性。
2)在轉換器,以便只有我的用戶界面會意識到這一點?
3)或在View模型中?
請提出我應該選擇哪個選項,爲什麼?
謝謝。
我有一個WPF DataGrid顯示產品。我有兩個字段的價格和質量,實際上是Product類的屬性。我需要在網格名稱MultipliedValue = price * mass中顯示一個單獨的列。根據MVVM模型,我應該在哪裏做?計算列應該在MVVM模型中的哪個位置?
1)在模型中通過只讀屬性。
2)在轉換器,以便只有我的用戶界面會意識到這一點?
3)或在View模型中?
請提出我應該選擇哪個選項,爲什麼?
謝謝。
我會忽略選項#2從開始 - 轉換器應該只用於說明UI的實現細節,特別是在MVVM中,甚至可能不是那樣(因爲您可以在ViewModel中進行轉換,選項#3,更方便)。
在#1和#3之間,在這種情況下,恕我直言,最好用#1 - 價格不是隻與您的用戶界面相關的東西,當然價格的概念(以及它是如何派生的)在整個應用程序中保持固定。用戶界面和後端都可以選擇使用此屬性。
我會爭辯不同(比@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方法也是正確的,並且是有原因的。我不認爲有一個答案。
通過使用您的設計,模型中定義的屬性將主要在ViewModel中重新定義。另外,您在ViewModel中定義了業務規則,但不是Model。這似乎與MVVM模式相矛盾。不過,你的設計似乎也很有趣。 – 2013-01-22 08:21:52
我不同意這種設計。您已將業務邏輯(總計字段)放入作爲應用程序層一部分的視圖模型中。另外我不明白你爲什麼沒有在模型上實現** INotifyPropertyChanged **,因爲它使所有事情變得更容易。 – 2015-07-31 11:24:43
謝謝@HosseinShahdoost。我會解釋一下:關於INotifyPropertyChanged不在模式中:這很簡單。我們希望保持模型的清潔和儘可能獨立。例如 - 該模型是我們序列化通過電線發送的。它應該始終只包含數據,並且可能(每種方式都有很多爭論)數據的驗證邏輯。至於Total字段,我會問你:MVVM應用程序中的應用程序層是什麼?這是觀點嗎?是模型(再次,你會序列化總數)? – Uri 2015-07-31 12:38:53
嗯..感謝您解決我的困惑。 – 2012-01-15 13:49:58