Это действительно зависит, если ваша модель уже реализует информацию INotifyPropertyChanged и / или IError, вы можете захотеть привязать ее прямо к свойству модели.Однако, если вы хотите выполнить специальную проверку и другие вещи, о которых модель ничего не знает, добавьте оболочки свойств в модель представления.
В этой статье приведен хороший пример гибрида: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Часто мои свойства MV выглядят так, и это вполне нормально:
public string Symbol
{
get { return Model.Symbol; }
set { Model.Symbol = value; this.NotifyOfPropertyChange(() => this.Symbol); }
}
Я часто НЕ реализую INotifyPropertyChanged в модели, и поэтому мне часто приходится писать оболочки.
РЕДАКТИРОВАТЬ:В ответ на вашу дополнительную информацию: Поддерживать синхронизацию коллекций и списков может быть немного сложнее.В вашем случае я хотел бы создать модель представления для каждого класса модели, но НЕ оборачивать все свойства, просто обращайтесь к ним следующим образом: {Bindng Customer.Name}.Но, конечно, вы должны создать оболочку для коллекций, которые содержат модели представлений.Документация Prism, как они сами говорят, просто руководство, если ваш сценарий нуждается в другом подходе, тогда это нормально.
Взгляните на этот код.Я обертываю только коллекции и свойства, к которым я получу доступ через модель.Это дает вам лучшее из обоих миров.Затем, если вам нужно специальное свойство, которое не принадлежит вашей модели, вы можете добавить его в модель представления (см. CustomerViewModel) или, если вам нужно специальное уведомление для определенных свойств.
class CompanyViewModel{
public CopanyViewModel(Company c){
foreach(var customer in c.Customers)
Customers.Add(new CustomerViewModel(customer);
}
public Company Company {get;set;}
public ObservableCollection<CustomerViewModel> Customers {get;set;}
}
class CustomerViewModel{
public CustomerViewModel(Customer c){
Customer = c;
}
public Customer Customer {get;set;}
public Brush CustomerBackground{
get{
if(Customer.Active)
return Brush.Greeen;
else
return Brush.Red;
}
}
}
(Этокод может не работать, я просто набрал его здесь.)
Теперь, если вам нужно изменить уведомление для всех моделей и всех свойств, вы должны либо реализовать его в своей модели, либо обернуть все свойства в модели представления..