MvvmLight Messaging - 注册和取消注册消息的正确方法是什么?

时间:2017-04-23 04:46:52

标签: c# mvvm uwp mvvm-light

我遇到了Message会多次触发的问题,因为Message在View的构造函数中注册时会被多次注册。绝大多数S.O.帖子,网站,博客显示如下例子:

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相关的元素(如viewmodel中的对话框)的第三个选项似乎违反了MvvM的概念。

注册和取消注册消息的正确方法是什么?

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

1 个答案:

答案 0 :(得分:0)

我通常使用一种模式,我的视图模型在IOC容器中注册(查看MVVMLight入门应用程序中的VireModelLocator类)并在ViewModel构造函数中注册消息。

这样,由于ViewModel的创建是由IOC处理的,因此您对相关视图的多次创建没有任何问题,消息注册只发生一次。

请记住,注册和取消注册邮件很容易将您带到一个非常难以发现的错误世界,但是由于某些原因,没有处理程序注册的邮件。

我还要补充一点,99%的view / viewmodel交互应该发生throgh绑定。

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