计算列应该在MVVM模型中的哪个位置?

时间:2012-01-15 13:35:27

标签: mvvm

我有一个显示产品的WPF DataGrid。我有两个字段的价格和质量,实际上是Product类的属性。我需要在网格名称MultipliedValue = price * mass中显示一个单独的列。根据MVVM模型我应该在哪里做?

1)在模型中通过创建只读属性。

2)在转换器中,只有我的用户界面会知道这个?

3)还是在View模型中?

请建议我应该选择哪个选项以及为什么?

感谢。

2 个答案:

答案 0 :(得分:3)

我会从一开始就忽略选项#2 - 转换器应该仅用于考虑UI的实现细节,特别是在MVVM中甚至可能不会(因为你可以在ViewModel中进行转换,这是选项) #3更方便)。

在#1和#3之间,在这种情况下,恕我直言,最好选择#1 - 价格不是仅与您的用户界面相关的东西,当然价格的概念(以及它的衍生方式)是在整个申请过程中保持不变UI和后端都可以选择是否使用此属性。

答案 1 :(得分:3)

我会争论不同(比@jon)。我只在模型中输入了我要序列化的属性(例如,从服务器)。计算属性不会序列化,因此它们不在模型中。

最近,我最喜欢的模型/视图模型范例如下:产品是模型中的一个类,除了最简单的getter和setter之外什么都没有。 ProductVm是VM中的一个类,它包含Product,并具有其他VM逻辑。最重要的是,该属性改变了通知 - 我认为这也是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();
    }
}

是的,这里有很多样板文件,但是一旦你完成所有的输入,你会发现Model和ViewModel之间的这种分离非常有用。我的2美分。

注意:我认为@Jon方法也是正确的,原因是有效的。我认为没有一个答案。