Расчетные столбцы должны быть где в модели MVVM? - PullRequest
0 голосов
/ 15 января 2012

У меня есть WPF DataGrid, отображающий Продукты. У меня есть два поля цена и масса в том, что на самом деле свойства класса продукта. Мне нужно показать отдельный столбец в сетке имя MultipliedValue = цена * масса. Согласно модели MVVM, где я должен это сделать?

1) В модели с помощью свойства readonly.

2) В конвертере, чтобы об этом знал только мой пользовательский интерфейс?

3) или в модели View?

Пожалуйста, предложите, какой вариант выбрать и почему?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Я бы поспорил иначе (чем @jon). Я добавляю в модель только те свойства, которые я хотел бы сериализовать (скажем, с сервера). Вычисленные свойства не сериализуются, и, следовательно, их нет в модели.

Недавно моя любимая парадигма Model / View Model выглядит следующим образом: Product - это класс в Model, в котором нет ничего, кроме простейших методов получения и установки. ProductVm - это класс в VM, который содержит 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();
    }
}

Да, здесь много шаблонов, но как только вы выполните всю печать, вы обнаружите, что это разделение между Model и ViewModel очень полезно. Мои 2 цента.

Примечание. Я думаю, что подход @Jon также верен и имеет веские основания. Я не думаю, что есть один ответ.

3 голосов
/ 15 января 2012

Я бы проигнорировал вариант № 2 с самого начала - конвертеры следует использовать только для учета деталей реализации пользовательского интерфейса, а в частности, в MVVM, возможно, даже тогда (так как вы можете выполнить преобразование внутри ViewModel, которая является опцией# 3 и более удобно).

Между # 1 и # 3, в этом случае ИМХО лучше всего пойти с # 1 - цена - это не то, что относится только к вашему интерфейсу и, конечно, концепция цены(и как это происходит) будет оставаться неизменным на протяжении всего вашего приложения.Пользовательский интерфейс и ваш сервер могут использовать это свойство или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...