MVVM с постоянно обновляемыми данными
В настоящее время я работаю над приложением Windows Store (8.1), которое должно выполнять следующие действия:
- Поговорите с USB HID-устройством (разобрался)
- Отображение данных с этого устройства (я хочу использовать Oxyplot для отображения этих данных, понял)
- Использовать MVVM (я выбрал набор инструментов SimpleMVVM, так как в нем уже есть шаблоны для VS2013)
- Создайте фиктивный поставщик данных, который генерирует случайные данные и передает их моей ViewModel
Теперь я застрял здесь относительно того, где поместить данные. Я использую очередь для хранения своих значений (я всегда хочу, чтобы отображались последние 100 значений). Теперь, что я помещаю в модель и что я помещаю в ViewModel.
Например, я бы поместил Очередь, содержащую точки данных, в мою ViewModel? Как бы я правильно запустил процесс "Получать данные каждые 1 секунду". Я подумал об использовании System.Threading.Threads.Timer для этого. Где бы я это положил? В агент MockDataServiceAgent? В этом случае: Как я могу получить доступ к моему ViewModel из ServiceAgent для выполнения обновления?
Все хорошо, если у вас есть кнопки и прочее, но что, если у вас есть случайные события, которые эффективно запускаются "чем-то другим", кроме представления?
2 ответа
Ваш Model
твой domain object
это фактическое data
или же information
Вы имеете дело с Пример Model
может быть что из Car
содержащий make
, model
, colour
и т.д. Главное здесь то, что Model
поддерживает information
а не поведение.
ViewModel
твой presentation separation
слой, он может обернуть один или несколько ваших Model
объекты. Это клей между вашим View
а также Model
разоблачение команд и методов, которые поддерживают View
состояние и может изменить состояние вашего Model
как результат actions
на View
,
Ваш data
должен поддерживаться вашим Model
, или же Models
, Это был бы твой ViewModel
что бы разоблачить, что data
и предоставить механизм для вашего View
потреблять это. ObservableCollection
это общий механизм для выставления коллекции data
к View
поскольку он динамический и предоставляет уведомления, когда в него добавлены, удалены или полностью обновлены элементы.
В идеале вы не хотите, чтобы ваши объекты имели прочные связи друг с другом, поэтому для обмена данными между объектами вы можете рассмотреть некоторую реализацию шаблона проектирования Mediator. Большинство сред MVVM имеют некоторую реализацию этого либо как Mediator
или же EventAggregator
шина сообщений. Они обеспечивают publish
а также subscribe
механизм, в котором один объект publishes
уведомление, содержащее некоторые данные и один или несколько subscribed
объекты получат это уведомление и обработают данные соответственно. Ни один из вовлеченных объектов не знает, кто является publisher
, subscriber
или кто участвует, они знают только о Mediator
реализация.
Вы можете поместить свою очередь, содержащую данные в вашем ViewModel
как ObservableCollection
тогда, когда ObservableCollection
изменен, он может обновлять все, к чему он привязан. Было бы лучше сохранить связь между ServiceAgent
а также ViewModel
слабосвязанный, я бы предложил использовать SimpleMvvm
Система сообщений, если она есть, я знаю MvvmLight
(другой инструментарий Mvvm) имеет один. Или вы можете создать его самостоятельно, используя шаблон Mediator. Или, если вы не хотите использовать посредника, используйте контейнер IoC. Просто получите ваш процесс обслуживания данных, чтобы обновить ObservableCollection
и это должно отменить необходимость беспокоиться о событиях (для обновления пользовательского интерфейса).