Свойства модели привязки непосредственно в представлении - PullRequest
3 голосов
/ 27 апреля 2011

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

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

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

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

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

1 Ответ

3 голосов
/ 28 апреля 2011

Это действительно зависит, если ваша модель уже реализует информацию 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;
     }
  }
 }

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

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

...