【问题标题】:MVVM light RelayCommand triggers twiceMVVM 灯 RelayCommand 触发两次
【发布时间】:2015-06-27 07:22:24
【问题描述】:

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

【问题讨论】:

  • 你说你用Loaded作为例子,你有没有尝试过其他事件?因为我知道加载被触发了两次

标签: c# wpf mvvm relaycommand modern-ui


【解决方案1】:

对于只应该运行一次的代码,我建议避免在 WPF 中使用 Loaded 事件。

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

如果代码只运行一次,我通常会将其放在构造函数中或在 getter 中延迟加载数据。

如果我真的想将 Loaded 事件用于只运行一次的事件,我将确保在第一次运行时从 Loaded 事件处理程序中分离事件。

【讨论】:

  • 好的,谢谢。我仍然很困惑为什么 OnNavigate 方法中也会发生这种情况,但我会尝试解决它。现在我知道这不是我的应用程序中的错误,谢谢! (感谢所有其他答案)
【解决方案2】:

加载的事件被触发两次。

阅读这篇解释它的博文:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx

或者更好的是,从另一篇文章中阅读此答案: Loaded event of a WPF user control fire two times

【讨论】:

  • 那个 SO 问题链接是一个很好的链接,可以简单地解释为什么 Loaded 事件被触发两次 :)
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多