У меня проблема с MVVM и два вида и соответствующие ViewModels.

У меня есть MainViewModel и SettingsViewModel.

Модель MainViewModel выполняется при запуске программы, считывая настройки из xml файла. Если я нажму на кнопку настроек в главном представлении, SettingsView будет открыт с привязкой SettingsViewModel и должен заполнить формы данными. Но проблема в том, как я могу получить данные из MainViewModel в SettingsViewModel?

В SettingViewModel у меня нет ссылки на MainViewModel. Как я могу ее получить?

Моей первой идеей было установить Data через конструктор, но я не могу использовать конструктор для этого, потому что я получаю экземпляры View с DataTemplate в App.xaml:

.
        
          
        

Моей второй идеей было решить эту проблему с помощью Events. Но и это не сработало, потому что я не получаю ссылку SettingsViewModel в MainViewModel.

Это мой первый проект с использованием паттерна MVVM. Возможно, это моя проблема с пониманием.

Я пытаюсь решить эту проблему уже неделю и сейчас я в полном отчаянии.

Я создал пример проекта на Github для лучшего понимания: https://github.com/fgth/Example

Пожалуйста, помогите мне - спасибо.

fgth

Ответов: 1

Ответы (1)

Это мой первый проект с использованием паттерна MVVM. Возможно, это проблема моего понимания.

Ваши слои MVVM в порядке.

  • Модель: Настройки
  • ViewModel: SettingsViewModel
  • View: SettingsView

Хранение / использование экземпляра Settings на родительской MainViewModel также имеет смысл.

Ваша проблема - это скорее непонимание между статикой и инстанцией.

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


    
        
            
        
    
    
        ...
    

Поскольку вы создаете новый экземпляр Settings в конструкторе SettingsViewModel, в итоге вы всегда будете иметь чистый лист.

public SettingsViewModel()
{
    Mysettings = new Settings();
    ...
}

Лучше было бы передавать экземпляр Settings из MainViewModel в SettingsViewModel при каждом запросе.

ActualPage = new SettingsViewModel(mysettings);

Обновленный конструктор, использующий Dependency Injection.

public SettingsViewModel(Settings settings)
{
    Mysettings = settings;
    ...
}

Не поток DataTemplate жаловался на конструктор, он просто сопоставляет типы. Однако статический ресурс требовал конструктор без параметров, но, опять же, нам не нужна эта функциональность. После обновления SettingsView все должно работать, как ожидалось.


    
        

Обратите внимание, что мы позволяем DataContext неявно передавать данные, что (часто) является признаком хорошего дизайна.

2022 WebDevInsider