2012-01-15 55 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

相关问题