2017-04-23 115 views
0

我跑进问题,即消息将触发多次,因为消息被多次注册时,在视图的构造函数被注册。大部分S.O.的帖子,网站,博客展示一个例子是这样的:MvvmLight消息 - 注册和取消注册消息的正确方法是什么?

public ConstructorOfView() { 
    DataContext = viewModelObject; 
    Messenger.Default.Register<SomeClass>(recipient, token, method); 
} 

public someUnloadOrNavigateFromMethod() { 
    Messenger.Default.Unregister<SomeClass>(parameters and more); 
} 

注销似乎对我没有任何影响。一些例子说在ViewModel中注册消息。这对我来说没有意义,原因有两个:1)如果将页面的DataContext设置为ViewModel,则ViewModel构造函数会再次被调用两次,就像视图构造函数一样。 2)如果你在ViewModel中注册了一个消息,你怎么告诉视图去激发一个方法,而不是公共静态的,它显示一个消息对话框?在视图模型中调用UI相关元素(如对话框)的第三种选择似乎违反了MvvM的概念。

什么是注册和注销信息的正确方法?

有些帖子建议让viewmodel调用Cleanup(),但不知何故你需要注册消息给viewmodel,但是我不清楚如果你将消息的接收者设置为viewmodel,viewmodel如何在视图中调用非公共静态方法来更改/显示UI?

回答

0

我通常在IOC容器中注册我的视图模型(查看MVVMLight初学者应用程序中的VireModelLocator类)并在ViewModel构造函数中注册消息。

这样,因为视图模型创建由国际奥委会来处理,你必须与相关视图的多个作品没有问题,消息登记只发生一次。

保持也记住,注册和unsegistering消息将很容易带你到非常困难的世界中找到你发送消息,但由于某些原因没有处理程序注册喷气错误。

我还想补充一点,视图/视图模型的相互作用的99%应该发生throgh结合。

我强烈建议审查WPF应用程序模板MvvmLight提供,以识别和理解的编程模式。

+0

感谢您的回复。有一件事我很困惑。如果在视图模型中注册消息,那么当对话框应该在视图中处理而不是视图模型时,如何更改或显示一块UI,如同一个对话框?对我来说,在视图模型中注册消息是没有意义的。 – ShrimpCrackers

+0

我理解你的疑问,并以某种方式同意它。事实上,thre是很多解决方案,也是基于您编写代码的平台。假设你正在为Windows编写一个wpf应用程序,第一个应用程序可能是:不是mvvm极端主义者,并直接在消息处理程序中调用MessageBox.Show。我有时候会这样做,它有效,它违反了一些MVVM原则,但可能为您节省数百行代码。其次:重新思考如何向用户显示消息,并使用绑定到某些UI控件来显示消息。第三:而不是一个对话框显示一个新的弹出视图。 –