Боюсь, вы что-то смешали. Основы 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 { /* ... */ }
}
Вы должны привязываться к модели представления. –