Привязка свойств модели непосредственно к виду

#data-binding #mvvm #model #prism

#привязка данных #mvvm #Модель #призма

Вопрос:

Я нашел этот текст в документации Prism. Я начинаю с MVVM и теряюсь. Можно (должно) Я привязываю свойства модели к представлению или я должен создать viewmodel со свойством прокси для каждого свойства в модели?

Классы моделей обычно предоставляют события уведомления об изменении свойств и коллекции через интерфейсы INotifyPropertyChanged и INotifyCollectionChanged. Это позволяет легко привязывать их к данным в представлении. Классы модели, которые представляют коллекции объектов, обычно являются производными от класса ObservableCollection.

РЕДАКТИРОВАТЬ: Вот некоторая дополнительная информация, которая поможет. Я создаю личный проект с нуля (поэтому я также разрабатываю модели), это первый раз, когда я использую MVVM, и я хочу научиться должным образом.

Моя модель очень иерархична, имеет классы со списком, внутри которых находится еще один класс с большим списком, строящий сложное дерево информации. Я пробовал «стандартный» подход MVVM, создавал модель с помощью POCO без уведомлений и использовал List. Затем создание ViewModel с соответствующими уведомлениями и использованием ObservableCollections.

Проблема в том, что при том, как это происходит, я почти реконструирую всю свою модель как ViewModel И вынужден синхронизировать данные между to (ObservableCollection со списком). Затем я прочитал это в документах Prism и подумал, должны ли у меня возникнуть все эти проблемы или просто создать корневую ViewModel для logic и привязать все остальное к самой модели.

Ответ №1:

На самом деле это зависит от того, если ваша модель уже реализует INotifyPropertyChanged и / или IError info, вы можете захотеть привязать прямо к свойству модели. Однако, если вы хотите выполнить специальную проверку и другие вещи, о которых модель ничего не знает, вы добавляете оболочки свойств в свою модель представления.

В этой статье приведен хороший пример гибрида: 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 в модели, и поэтому мне часто приходится писать оболочки.

РЕДАКТИРОВАТЬ: В ответ на вашу дополнительную информацию: может быть немного сложно синхронизировать коллекции и списки. В вашем случае я бы сделал, это создал модель представления для каждого класса модели, но НЕ переносил все свойства, просто получил к ним доступ следующим образом: {Привязка клиента.Имя}. Но, конечно, вы должны создать оболочку для коллекций, содержащих модели представлений. Документация 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;
     }
  }
 }
  

(Этот код может не сработать, я только что ввел его здесь.)

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

Комментарии:

1. Я отредактировал свой вопрос, добавив дополнительную информацию о моем проекте и почему я задал этот вопрос.

2. Эй, я еще немного изучил и, думаю, наконец-то смирился со своими требованиями. Я буду использовать IDataErrorInfo, INotifyPropertyChanged и ObservableCollection в своих моделях. Они не зависят от WPF и решат почти все мои проблемы.

3. Да, они есть в системе. Пространство имен ComponentModel, которое должно использоваться для создания вашей модели домена (вот почему, например, Collection<T> есть, а List<T> нет, потому что ваша модель должна предоставлять коллекции, а не списки и т.д.). В любом случае, вы найдете там много интересного. Иногда вы не можете добавить INorifyChanged в свою модель по разным причинам, но в вашем случае это может иметь смысл. Также убедитесь, что вы используете что-то подобное для своих измененных уведомлений: csharperimage.jeremylikness.com/2010/06 /… . Упрощает рефакторинг.

4. Спасибо, я (пере) планирую модель и viewmodels, также я подумываю об изменении подхода к viewmodel (концепция все еще немного чужда мне, но я добираюсь до нее). Кроме того, у Prism есть NotificationObject, который предоставляет RaisePropertyChanged, это действительно полезно.