【问题标题】:MVVMLight Message firing multiple times in WP7 appMVVMLight 消息在 WP7 应用程序中多次触发
【发布时间】:2010-11-01 01:38:53
【问题描述】:

我是 MVVMLight 的新手,并已开始在我的 WP7 应用程序中使用它。我有一个注册 MessageDialogs 的视图/页面,然后我的 VM 发送消息以显示它。这很好用。但是,当您返回上一个屏幕(使用 WP7 后退按钮)然后再次进入页面(使用 AppBar 菜单项)时,消息会触发两次(每次查看页面时都会增加)。我认为 View 每次都在注册,并且旧版本正在订阅该消息,但我不确定它应该如何工作。

我尝试在 NavigatedFrom 事件中调用 VM.Cleanup 以确保旧消息在离开页面时未注册,但这没有帮助。这是我的代码:

查看:

public AboutPage()
{
    InitializeComponent();

    Messenger.Default.Register<DialogMessage>(this, msg => { var result = MessageBox.Show(msg.Content, msg.Caption, msg.Button); });
}

    protected override void OnNavigatedFrom(NavigationEventArgs args)
    {
        ViewModelLocator.AboutViewModelStatic.Cleanup();
        base.OnNavigatedFrom(args);
    }

AboutViewModel:(代码被命令触发)

        var message = new DialogMessage("Why does this fire multiple times?", DialogMessageCallback) { Button = MessageBoxButton.OK, Caption = "" };
        Messenger.Default.Send(message);

这就是它的全部内容,但是每次您访问此页面时,它都会再次触发...我认为这与 Cleanup 有关,但我不确定它应该如何在 WP7 中工作...任何提示表示赞赏...

【问题讨论】:

    标签: silverlight windows-phone-7 mvvm-light


    【解决方案1】:

    在您浏览应用程序时会创建和销毁视图。因此,在 AboutPage 视图的构造函数中,视图在每次创建时都会注册消息。

    更好的方法是在 ViewModel 的构造函数中设置注册,使用 ViewModelLocator 并将 View 数据绑定到 ViewModel。 ViewModel 创建一次,并在应用程序的整个生命周期中使用。 Jonas Follesoe's FlightsNorway 是学习 MVVMLight 的好 WP7 应用程序,你可以发现 MVVMLight Messenger 类使用得非常好。

    HTH,indyfromoz

    【讨论】:

    • 嗨 indyfromoz - 谢谢,我已经下载了源代码并检查了它 - 但是,我认为对于对话框,View 是处理它的注册/显示的更好地方 - VM 只是让 V知道什么时候展示吗?即使我的示例中的视图每次都被销毁和创建 - 旧的消息侦听器不应该被视图销毁吗?我正在使用 ViewModel + VMLocator 方法以及在您的视图中引发对话框的方式,例如 MVVMLight 示例 - galasoft.ch/mvvm/resources/Samples/DialogMessageSample.zip。不过,此示例不适用于 WP7 页面。
    • 恐怕我还没有深入挖掘 MVVMLight 库的源代码,因此,我无法进一步评论,抱歉。我有一种感觉,信使为每个注册消息的听众保留了一个参考。
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多