MVVM light RelayCommand 触发两次

MVVM light RelayCommand triggers twice

我正在开发一个新的 c# MVVM 轻型现代 ui WPF 应用程序,我 运行 遇到了一些奇怪的触发器行为。因此,为了描述这种情况,以下是:

我有一个带触发器的 XML 视图。 (加载方法为例)

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding LoadedCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

带有中继命令的构造函数(来自抽象模型的 LoadedCommand)

    public MovieListModel()
    {
        LoadedCommand = new RelayCommand(LoadData);
    }        
    private void LoadData()
    {
        Debug.WriteLine("MovieListModel - LoadData");
    }

问题: 当应用程序启动时,loadedcommand 被调用 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 上开了一张票,看看这是否是 problem/bug。 (还没有回复)

我建议避免 WPF 中的 Loaded 事件,因为代码只应 运行 一次。

WPF 会卸载未使用的控件(例如应用程序最小化或更改标签页),因此 Loaded 命令通常会 运行 不止一次。

如果代码只打算 运行 一次,我通常会把它放在构造函数中或在 getter.

中延迟加载数据

如果我真的想将 Loaded 事件用于仅用于 运行 一次的事件,我将确保在事件 运行是第一次。

加载事件触发两次

阅读此博客post 对其进行解释:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx

或者更好的是,阅读另一个 post 的答案: Loaded event of a WPF user control fire two times