Я нахожусь в аду MVVM ViewModel

До сих пор я действительно доволен способом, которым вещи вошли в переход моего приложения от типичных обработчиков события Click везде, для завершения отделения GUI. Теперь я сталкиваюсь с чем-то, что я не могу вполне выяснить, и это связано с окном, что я хочу, чтобы мой GUI открылся, и это должно отобразить информацию из модели.

Я предполагаю, что короткая версия моего вопроса, абсолютно запрещается в MVVM позволить модели иметь ссылку на ViewModel? Вот мой сценарий: у Меня есть банк светодиодов, которые циклы через RGB оценивают очень быстро. Я хотел бы, чтобы окно в моем GUI отобразило обновленные цвета через привязку данных с ViewModel. У меня есть Окно + UserControl, хорошо работающий с макетом ViewModel в тестовом приложении, но теперь я должен поместить это Окно в свое реальное приложение.

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

Моя текущая реализация MVVM в основном опрашивает все время. Чтобы заставить другие светодиоды обновлять в другом месте, у меня есть поток, работающий, который вызывает функцию в ViewModel. Это обновляет свойства, и таким образом, GUI автоматически обновляет, так как я использую привязку данных. Проблема в моем светодиодном примере состоит в том, что моделирование цветной последовательности сделано в потоке, поэтому если я должен сделать, чтобы ViewModel опросил относительно значений, это, вероятно, будет медленно из-за чрезмерной блокировки светодиодных переменных.

Поэтому я надеюсь, что кто-то может рекомендовать другой подход к этой проблеме. До сих пор единственная вещь, о которой я мог действительно думать, состоит в том, чтобы иметь Окно datacontext быть LEDViewModel и затем затем передать LEDViewModel Модели. Затем, когда я вызываю функцию циклического повторения RGB, она может изменить необходимые свойства ViewModel по мере необходимости, и я не должен буду использовать блокировку вообще.

Это имеет смысл? Любой совет действительно ценился бы.

5
задан Dave 20 January 2010 в 21:05
поделиться

3 ответа

Вы пытались просто реализовать интерфейс IntifyPropertyChanged на вашей модели?

Мне казалось бы, что это должно быть достаточно хорошо. Когда состояние цвета изменяется на вашей модели, вы можете устрелить событие PropertyChanged события, обновляйте состояние «Просмотр», из этого уведомления и имейте обновление просмотра через привязку к модели View.

7
ответ дан 13 December 2019 в 22:07
поделиться

Почему бы не использовать событие в какой-нибудь центральной системе сообщений для вашего приложения?

Самым простым способом сделать это было бы использование Messenger в MVVMFoundation: http://mvvmfoundation.codeplex.com/

Примером этого было бы:

public class MyHardwareModel
{
     private void OnHardwareLEDChanged() // or whatever
     {
          SharedMessages.Messenger.NotifyColleagues(SharedMessages.LEDCHANGED);
     }
}

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

public class MyHardwareViewModel
{
     public MyHardwareViewModel()
     {
          SharedMessages.Messenger.Register(SharedMessages.LEDCHANGED, UpdateLeds);
     }

     private void UpdateLeds()
     {
          //Update ObservableCollection here.
     }
}

Шаблон message mediator/broker действительно полезен в этих ситуациях для гораздо большего, чем просто для этого. Messenger, встроенный в MVVMFoundation, довольно мощный... в моем примере я использую довольно общие сообщения, но вы можете посылать больше набранных сообщений с параметрами.

Есть похожая функция, встроенная в Prism / Composite Application Guidance, если вы используете функцию под названием EventAggregator. Она используется аналогичным образом.

Надеюсь, это поможет.

3
ответ дан 13 December 2019 в 22:07
поделиться

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

0
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: