MVVM指示灯RelayCommand触发两次

时间:2015-04-20 14:01:33

标签: c# wpf mvvm relaycommand modern-ui

我正在开发一个新的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上启动了一张票,以确定这是否是一个问题/错误。 (尚未回复)

2 个答案:

答案 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