Каков рекомендуемый способ сообщить модель изменение модель представления
Я впервые открываю для себя 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.