MVVM light RelayCommand срабатывает дважды
Я работаю над новым C# MVVM легким современным пользовательским интерфейсом WPF и столкнулся с каким-то странным поведением триггера. Итак, чтобы описать ситуацию, вот что:
У меня есть представление XML с триггерами. (Загруженный метод в качестве примера)
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Конструктор с relaycommand (LoadedCommand из абстрактной модели)
public MovieListModel()
{
LoadedCommand = new RelayCommand(LoadData);
}
private void LoadData()
{
Debug.WriteLine("MovieListModel - LoadData");
}
Проблема: при запуске приложения загруженная команда вызывается 1 раз (хорошо). Когда я перехожу на другую страницу внутри приложения, запускаются как первое, так и новое представление LoadedCommand. Другие команды также запускаются дважды. Я предполагаю, что это станет проблемой, если я захочу добавить немного логики программирования позже.
Полный debug.writeline выглядит следующим образом:
ModernUserControl - OnNavigatingFrom
MovieListModel - NavigatingFrom
ModernUserControl - OnNavigatingFrom event called
ModernUserControl - OnNavigatedFrom
MovieListModel - NavigatedFrom
ModernUserControl - OnNavigatedFrom event called
ModernUserControl - OnNavigatedTo
MovieListModel - LoadData
SettingsModel - LoadData
Информация: я нашел эту проблему в примере программы, найденной здесь: https://github.com/saramgsilva/ModernUISamples и в моем собственном приложении. Я также запустил тикет на github, чтобы узнать, это проблема / ошибка или нет. (пока нет ответа)
2 ответа
Я бы порекомендовал избегать Loaded
событие в WPF для кода, который должен запускаться только один раз.
WPF выгружает элементы управления, которые не используются (например, если приложение свернуто или вы меняете вкладки), поэтому Loaded
Команда часто запускается более одного раза.
Если код предназначен для запуска только один раз, я обычно либо помещаю его в конструктор, либо загружаю данные с отложенной загрузкой в геттер.
И если я действительно хочу использовать Loaded
Событие для чего-то, что должно выполняться только один раз. Я обязательно отключу событие из обработчика события Loaded при первом запуске.
Загруженное событие запускается дважды.
Прочтите этот пост в блоге, объясняющий это: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx
Или даже лучше, прочитайте этот ответ из другого поста: загруженное событие пользовательского элемента управления WPF запускается два раза