代码之家  ›  专栏  ›  技术社区  ›  Rodney

在WP7应用程序中多次触发MVVMLight消息

  •  2
  • Rodney  · 技术社区  · 14 年前

    我是MVVMLight的新手,已经开始在我的WP7应用程序中使用它。我有一个视图/页面,它为消息对话框注册,然后我的VM发送消息来显示它。这很管用。但是,当您返回到上一个屏幕(使用WP7 back按钮)然后再次进入页面(使用AppBar菜单项)时,消息将触发两次(每次查看页面时都会递增)。我假设视图每次都在注册,旧版本订阅消息,但我不确定它应该如何工作。

    我试图在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);
        }
    

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

    这也是它的全部,但每次你来到这一页,它会再次开火。。。我想这和清理有关,但我不确定它在WP7中是如何工作的。。。谢谢你的任何建议。。。

    1 回复  |  直到 14 年前
        1
  •  0
  •   indyfromoz    14 年前

    浏览应用程序时,将创建并销毁视图。因此,在AboutPage视图的构造函数中,该视图在每次创建消息时都会对其进行注册。

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