Я бы поспорил иначе (чем @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 также верен и имеет веские основания. Я не думаю, что есть один ответ.