Команда ICommand не привязывается к загруженному событию с использованием фреймворка MVVMLight

#mvvm #icommand

#mvvm #icommand

Вопрос:

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

У меня есть приложение инвентаризации, и на главной странице большая часть ViewModel вызывается из-за кнопки «Назад», которая возвращается к определенным спискам и вызывает то, что оно начнет привязывать, даже если эта команда не для этой страницы, и она также загрузит коллекции для других страниц.

Поэтому я использовал событие Loaded page для вызова необходимых методов для заполнения списков, а также запуска команд привязки для этой конкретной страницы. Я также использовал событие выгруженной страницы для очистки, например, для отмены подписки на некоторые CRUD-события.

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

Я создал миниатюрное приложение для демонстрации проблемы. Его можно загрузить здесь (полный исходный код включен) https://www.dropbox.com/s/qzumzyicuvrktsi/ICommandTest.zip?dl=0
введите описание изображения здесь

Ответ №1:

Это связано с тем, что ваши представления не получают уведомления об изменении Command_ShowAddWindow и Command_ClickMe . Позвольте мне объяснить:

При Page первом запуске вашего конструктора привязки к вашим командам инициализируются и передаются в представление, но к тому времени ваши команды будут null , поэтому представление привязывает команды обеих кнопок. null

Затем, когда ваше Loaded событие запускается, команды инициализируются, но представление не получает уведомления об этом, поэтому оно сохраняет привязки команд null .

Решения проблемы следующие:

Вы вручную вызываете RaisePropertyChanged , чтобы уведомить представление об изменении команд при их инициализации:

 void InitCommands()
{
    Command_ShowAddWindow = new RelayCommand(Command_ShowAddWindow_Click);
    Command_ClickMe = new RelayCommand(Command_ClickMe_Click);
    RaisePropertyChanged("Command_ShowAddWindow");
    RaisePropertyChanged("Command_ClickMe");
}
 

Или вы инициализируете свои команды в своем конструкторе ViewModel до инициализации привязок данных:

 public ViewModel_Page1()
{
    InitCommands();
    ...
}