Brian J Hoskins Ответов: 1

Каков рекомендуемый способ сообщить модель изменение модель представления


Я впервые открываю для себя MVVM и использую Caliburn.Микро.

Я могу сформулировать свой вопрос на реальном примере:

На мой взгляд, у меня есть combobox, из которого пользователь может выбрать доступный Компорт. Выбранный элемент привязывается к свойству в ViewModel.
В одной из моих моделей у меня есть класс сканера, который будет использовать выбранный пользователем компорт.

Это означает, что класс scanner должен знать об изменениях свойства Comport в ViewModel. Вопрос в том, как лучше всего это реализовать?

Я все обдумал:

1: Устанавливайте свойства / вызывайте методы в классе сканера непосредственно из ViewModel, когда происходит изменение:

public string SelectedPartScannerComPort
{
   get { return _selectedPartScannerComPort; }
   set
   {
       _selectedPartScannerComPort = value;
       NotifyOfPropertyChange(() => SelectedPartScannerComPort);
       OnSelectedPartScannerComPortChanged();  // Access model directly from this method in the ViewModel to make changes.
   }
}


...
...
private void OnSelectedPartScannerComPortChanged()
{
    Models.Equipment.PartScanner.SetupPort(SelectedPartScannerComPort); // Access the model to implement the change.
}


Это работает, но это означает, что в ViewModel есть код, специфичный для работы модели.

2:
Я считаю, что уведомляющее свойство в ViewModel-это событие, поэтому я должен быть в состоянии подписаться на него из модели.
// In the Model:
shellViewModel.SelectedPartScanner.PropertyChanged += OnPartScannerPropertyChanged;

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

Похоже, что независимо от того, что я буду делать, либо ViewModel должен знать о модели, либо модель должна знать о ViewModel.
Допустима ли такая практика? Есть ли лучшие способы сделать это?

Что я уже пробовал:

Я попытался непосредственно установить свойства / вызвать методы в модели из viewmodel. Это работает, но я обеспокоен тем, что неправильно понимаю MVVM.

1 Ответов

Рейтинг:
8

Graeme_Grant

Если ваш базовый класс для вашей модели реализует INotifyPropertyChanged, то ваш ViewModel может подписаться/отписаться от модели PropertyChanged событие.


Brian J Hoskins

Спасибо за ответ, Грэм. Я полагаю, что вы немного неправильно поняли мой вопрос: я хочу сообщить модели об изменении модели представления, а не наоборот.
Тем не менее, ваш ответ все еще полезен, поскольку я смущен этим обменом информацией в более общем плане, и это действительно цель моего вопроса.

Таким образом, неизбежно ViewModels и модели будут связаны через такой код, и не будет 100% разделения проблем. Кажется, что этого не может быть: как еще модели могут выполнять полезную работу в ответ на изменения в ViewModels?

Тем не менее, я думаю, что я также неправильно понимаю назначение моделей. Во многих учебниках объясняется, что модели содержат ваши данные, и это заставляет ViewModel информировать графический интерфейс об изменениях в данных.
Это имеет смысл в том направлении, в котором вы ответили на мой вопрос.

Но у меня есть другое приложение к этому. У меня есть части оборудования, которые делают вещи, и я могу настроить оборудование и управлять им из графического интерфейса. Мне так кажется, что поток данных от модели ViewModel -и GT; модель, чем модель -&ГТ; модель представления. Но и поток данных может быть обоюдным, я думаю?

У меня складывается общее впечатление, что я неправильно понимаю что-то фундаментальное в MVVM, но до сих пор никакое количество Гугла или чтения учебников не помогло мне добиться прогресса.

Graeme_Grant

Окей. Чтобы ответить на ваш комментарий, я объясню, как я справляюсь с этим сценарием.

1. Модели для меня-это контейнер данных, в значительной степени POCO с INotiftPropertyChanged реализованный.
2. ViewModels-это интерфейс между моделью и представлением. Довольно стандартный.
3. любые специализированные функции разбиваются между репозиториями для обработки хранения/извлечения данных и службами, поддерживающими конкретные задачи. Доступ к репозиториям и сервисам осуществляется через ViewModel.

При описанном выше подходе нет необходимости в том, чтобы ViewModel уведомлял модель, ViewModel будет взаимодействовать с/уведомлять репозиторий/службу.

Надеюсь, это имеет смысл.

Brian J Hoskins

Да, это имеет прекрасный смысл. Спасибо тебе, Грэм!

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

Вы дали мне уверенность, чтобы продолжить, и я считаю, что вопрос решен, спасибо!

Graeme_Grant

Добро пожаловать, Брайан. :)