2013-06-18 2 views
2

У меня есть некоторые сомнения в том, какие лучшие методы для MVVM используют отношения модели родитель-ребенок.MVVM - ViewModel/привязка модели

В этом конкретном случае существуют две модели (классы данных), называемые Group и Contact. Группа содержит список контактов. Оба они реализуют интерфейс INotifyPropertyChanged.

В представлении есть дерево, отображающее иерархию с использованием DataTemplate, а связанная с ним ViewModel содержит свойство ObservableCollections.

Мне интересно, что это за лучший дизайн в этом случае .... Имея одно свойство, как указано выше в ViewModel, которое привязывается к xaml или создает ViewModel для каждой модели (например, GroupViewModel и ContactViewModel), а вместо ObservableCollections со списком.

Каков наилучший способ (дизайн мудрых)? Shoudl Я привязываю модель или ViewModel к xaml?

+0

Вы должны привязываться к модели представления. –

ответ

3

Боюсь, вы что-то смешали. Основы MVVM:

  • Модель - содержит данные, с которыми работает приложение. Он должен быть максимально простым.
  • ViewModel - отражает состояние приложения и содержит бизнес-логику. Это бизнес-уровень.
  • View - интерпретирует ViewModel, чтобы обеспечить визуальное представление бизнес-уровня и его состояния.

С этими тремя частями довольно легко обеспечить разделение проблем и развязанной архитектуры. Если вы хотите узнать больше, click here.

Вернуться на вопросы:

В этом конкретном случае есть две модели (классы данных), называемые группы и контакты. Группа содержит список контактов. Оба они реализуют интерфейс INotifyPropertyChanged.

Это немного странно. Обычно вам не нужно реализовывать INotifyPropertyChanged в классах моделей, так как VM должна обрабатывать изменения значений из представления.

Но это также возможно, чтобы этот механизм использовался в слое модели. Но так как вы не хотите отслеживать изменения на этом уровне, а IMHO VM должна заботиться, вам это не нужно.

[...] Имея одно свойство, как выше в ViewModel, который связываться с XAML или createing модель представления для каждой модели (например, GroupViewModel и ContactViewModel) [...]

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

[...] и вместо ObservableCollections имеет список.

Это определенно №. Если вы используете List<T>, представление не будет знать об изменениях (добавлении, удалении) в коллекцию.

Каков наилучший способ (дизайн мудрый)? Shoudl Я привязываю модель или ViewModel к xaml?

Просто придерживайтесь MVVM. Представление известно о VM, но VM не знает о представлении. Кроме того, VM знает модель, но модель не знает об этом. Это означает, что вы всегда должны привязывать виртуальную машину к представлению.

Редактировать

Следующая полностью законны.

public class Address : ViewModelBase // implements INotifiedPropertyChanged a.s.o. 
{ 
    public string Street { /* you know what comes here */ } 
    public string ZipCode { /* ... */ } 
    public string City { /* ... */ } 

    /* more properties */ 
} 

public class Person : ViewModelBase 
{ 
    public string Name { /* ... */ } 

    public Address Address { /* ... */ } 
} 
+0

Спасибо за отзыв Я имел в виду, что вместо наличия ObservableCollection у меня будет ObservableCollection . Моя ошибка :) –

+0

Вы думаете, лучше привязать ViewModel вместо Модели в xaml. –

+0

Ну, это зависит от точки зрения или шаблона. Могут быть некоторые сценарии (например, небольшие приложения), в которых не стоит создавать виртуальную машину. Но если вы придерживаетесь MVVM ... да ... это единственный способ. Это один из основных механизмов. – DHN

Смежные вопросы