#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();
...
}