2013-10-12 5 views
1

Я пытаюсь изучить шаблон MVVM и, в частности, что делать, когда представление представляет таблицу базы данных, но представление имеет несколько элементов, представляющих одно поле базы данных. В качестве простого примера:Модель в архитектуре MVVM по сравнению с MVC

Предположим, у меня есть поле базы данных с типом DateTime (с классом, имеющим свойство для каждого поля базы данных), но в представлении у меня есть параметр datepicker для компонента даты и TimeSpan для времени.

В шаблоне MVC у меня всегда была бы модель POCO, содержащая свойство DateTime с нулевым значением для datepicker и свойство TimeSpan с нулевым значением для времени. Я бы сопоставил класс базы данных с моделью.

В шаблоне MVVM я могу обернуть класс, представляющий поля базы данных, и иметь логику в установках доступа, которые сохраняют свойство DateTime с завершенным классом (и поскольку 2 поля имеют значение NULL, частные поля DateTime и TimeSpan в viewmodel, только устанавливая свойство Datetime класса базы данных, если и дата, и время не являются нулевыми)

В качестве альтернативы, я могу иметь модель обзора, более похожую на модель MVC - то есть на модель POCO с компонентами даты и времени, представляющими Отдельные свойства. Затем viewmodel становится гораздо более простой оболочкой, которая реализует INotifyPropertyChanged, а также сохраняет ICommand, который добавляет дату и время, только когда он создает или обновляет экземпляр класса базы данных.

Очевидно, что оба подхода «работают», но что будет считаться лучшей практикой и/или наиболее приверженными архитектуре MVVM. Спасибо.

ответ

0

Я закончил сопоставление и разделение даты с моделью базы данных на сопоставленную модель, поскольку это было лучше для сообщений проверки достоверности для пользователя (модель реализовала IDataErrorInfo). как я был DateTime, который нужно было до сих пор, я мог бы разделить проверку в модели в:

Если дата после сегодняшней даты -> возвращенная строка «Невозможно использовать дату позже, чем сегодня»

иначе если дата присутствует, но время отсутствует -> возвращенная строка «Пожалуйста, введите время»

еще если DateTime после сейчас -> возвращенная строка «не может быть позднее текущей даты и времени»

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

1

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

Было бы лучше, если бы вы использовали первый подход.

+0

Спасибо за ваше время, но я вообще не понимаю (почему модель представления не должна внедрять INotifyPropertyChanged или как простое настольное приложение в .net может закончиться несколькими потоками, если я специально не разработал такие вещи) мог бы вы укажите ссылку? – Brent

+0

См. Следующую ссылку http://social.msdn.microsoft.com/Forums/vstudio/en-US/1fef5c4e-53d6-40c6-8c7e-6a98d5a8f865/crossthread-call-with-wpf?forum=wpf –

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