我正在开发一个新的c#MVVM轻型现代ui 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上启动了一张票,以确定这是否是一个问题/错误。 (尚未回复)
答案 0 :(得分:2)
我建议在WPF中避免Loaded
事件,因为代码只能运行一次。
WPF卸载未使用的控件(例如,如果应用程序已最小化,或者您更改了标签页),因此Loaded
命令通常会运行多次。
如果代码只运行一次,我通常会将它放在构造函数中,或者在getter中加载延迟数据。
如果我真的想将Loaded
事件用于仅运行一次的事件,我将确保在第一次运行时从Loaded事件处理程序中分离事件。
答案 1 :(得分:2)
加载的事件被触发两次。
阅读此博客文章解释:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx
甚至更好,请从另一篇文章中阅读此答案: Loaded event of a WPF user control fire two times