MVVM: это хорошая практика для подражания? - PullRequest
4 голосов
/ 04 января 2011

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

Итак, у нас есть Model, представляющая коллекцию ModelItem.

Представление привязывается к ViewModel, которая предоставляет ObservableCollection of ViewModelItem.ViewModelItem - это Viewmodel ModelItem

Представление содержит ListBox и DataTemplate.DataTemplate для элементов типа ViewModelItem.View DataContext указывает на экземпляр ViewModel.ListBox привязывается к ObservableCollection.

Я управляю всем кодом.

Пока все просто.Вопрос:

Допустимо ли выставлять коллекцию в модели как ObservableCollection?Кроме того, допустимо ли реализовать INotifyPropertyChanged для Model и ModelItem?

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

Просто хотел получить какую-то точку зрения от других.

Спасибо

Ответы [ 4 ]

4 голосов
/ 04 января 2011

Краткий ответ: ДА.Используйте свои интерфейсы уведомлений в вашей модели, когда вам нужно уведомлять об изменениях.Не беспокойтесь об этом.Будьте прагматичны.

Длинный ответ: Моя философия заключается в следующем: при реализации MVVM выполняйте привязку напрямую к объектам модели, когда делать больше нечего.Когда вам нужно что-то новое (новое поведение, свойства, которые будет использовать представление и т. Д.), Тогда вы оборачиваете объекты модели в объекты ViewModel.Модель ViewModel, которая не делает ничего, кроме делегирования данных из модели, является не чем иным, как дополнительным кодом.В тот момент, когда вам нужно что-то сделать с этими данными после того, что дает вам объект модели, вы вводите слой.

Итак, чтобы продолжить мои мысли по этому поводу (и ответить на ваш вопрос более прямо), естьдолжен быть способ для модели сообщать ViewModel, когда что-то меняется.Зачастую данные модели являются неизменяемыми, поэтому для них не требуется этот механизм уведомлений, поэтому в этом нет необходимости.НО, это также часто бывает, что модель меняется.Когда это происходит, модель имеет два варианта: использовать пользовательский метод уведомления (события, делегаты и т. Д.) Или использовать INotifyPropertyChanged.

Если вы посмотрите на пространство имен для INotifyPropertyChanged, оно находится в System.ComponentModel, а не в виде, поэтому я предпочитаю использовать его в модели.Это хорошо известный интерфейс, и вы можете использовать его для непосредственного связывания с вашей моделью с вашей точки зрения.Не нужно реализовывать что-то другое.

Если продвинуть эту философию на один шаг дальше, ObservableCollection в System.Collections.ObjectModel - также не зависит от вида - и он реализует System.Collections.Specialized.INotifyCollectionChanged, который также не зависит от вида.,Другими словами, ObservableCollection был разработан как коллекция, которая уведомляет своих наблюдателей об изменениях.Если у вас есть модель, которая должна это сделать, тогда ObservableCollection - ваш инструмент.Просто бывает удобно (хотя и не случайно), что WPF и Silverlight используют эти интерфейсы для привязки данных.

Я полагаю, что это довольно многословный способ сказать: «ДА. Используйте свои интерфейсы уведомлений навашей модели, когда вам нужно уведомить об изменениях. Не беспокойтесь о том, чтобы запутать ваш код этим. Будьте прагматичны. "

3 голосов
/ 04 января 2011

Нет.Это ужасно.Ваша модель не должна знать, как она используется.Предоставление ему этих знаний побеждает объект MVVM.
Модель никогда не должна знать, что она используется WPF, winforms, доской консоли, в качестве службы или в качестве библиотеки.Если вы скажете это, вы идете не так.Он также должен быть независимым от фреймворка, не обращая внимания на то, является ли он частью MVVM, MVC или MXXX!

2 голосов
/ 04 января 2011

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

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

2 голосов
/ 04 января 2011

Определенно приемлемо делать и то и другое.Я бы даже сказал, что требуется , чтобы сделать оба.Ваши способности здравого смысла работают просто отлично.:)

Я бы только добавил, что если вам не нужны все функции MVVM для ваших ModelItem s, то вы можете сократить некоторые углы, выставив ObservableCollection<ModelItem> вместо ObservableCollection<ViewModelItem>, иизменив свой DataTemplate под костюм.Это сэкономит вам немного «подготовительного» кода, так что взвесьте все за и против.

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