Как выставить коллекцию модели в ViewModel - PullRequest
5 голосов
/ 09 августа 2011

Я реализую MVVM для класса, который представляет рекурсивно вложенные типы. Например:

class NestedType
{
    // Other properties here

    public Collection<NestedType> SubElements {get; set;}
}

class NestedTypeViewModel
{
    ObservableCollection<NestedType> ModelCollection { ??? }
}

Как выставить предметы из коллекции Модели в видимой форме? (т.е. представление будет добавлять, создавать и изменять подэлементы) Я предполагаю, что мне нужно, чтобы коллекция в ViewModel была ObservableCollection<T>, но как насчет модели? Я мог бы также сделать это ObservableCollection и просто напрямую выставить его ...

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Вы можете напрямую вернуть ObservableList из вашей модели. WPF примет ссылку на коллекцию и зарегистрирует событие CollectionChanged коллекции моделей.

class MyViewModel
{
  public ObservableCollection<NestedType> MyItems { return Model.Items; }
} 

НО, вы сломаете то, что пытаетесь достичь, используя MVVM. ViewModel не должен предоставлять модель, отдельный объект или коллекцию, в противном случае ваше представление может привязаться к модели, чего не следует делать в MVVM.

Ну, MVVM - это не религия, и каждый реализует определенные части по-своему. Если это не проблема для вас ... Продолжайте и делайте это напрямую.

Если вы хотите чистое решение, у вас есть несколько вариантов, чтобы перейти отсюда. Просто позволяя менеджеру изменить коллекцию модели и создать соответствующую модель представления или подход «Мой любимый» - это иметь объект, который синхронизирует коллекцию модели и модели представления, автоматически оборачивая вновь добавленные модели в новую модель представления и добавляя этот vm в список родительских представлений.

0 голосов
/ 09 августа 2011

Вы можете жить без отдельной Model сущности, если вам не нужно передавать различные Models в ViewModel, так что вы можете придерживаться ViewModel, который представляет действительные Model данные.

Я бы порекомендовал выставить его используя закрытое поле под капотом вместе с INotifyPropertyChanged:

class NestedTypeViewModel 
{     
    private ObservableCollection<NestedType> dataItems; 

    public ObservableCollection<NestedType> DataItems
    {
       get
       { 
          return this.dataItems;
       }
       private set
       {
           this.dataItems = value;
           // here is should be OnPropertyChanged("DataItems") call
       }
    } 
} 

РЕДАКТИРОВАТЬ: ответ на комментарии

Но если у вас уже есть такая сущность, как Model, - попробуйте внедрить в ViewModel интерфейс, чтобы по крайней мере Model и ViewModel были разделены

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