MVVMLIGHT消息传递 - 注册和注册消息的正确方法是什么?



我遇到了一条消息将发射多次的问题,因为当消息在视图的构造函数中注册时,已多次注册消息。S.O的绝大多数帖子,网站,博客显示这样的示例:

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

未注册似乎对我没有影响。一些示例说要在ViewModel中注册消息。这对我来说没有意义,原因有两个:1(如果将页面的数据台面设置为视图模型,则视图构造函数再次被调用,就像视图构造函数一样。2(如果您在ViewModel中注册一条消息,则如何确切地告诉视图以触发一种方法,除了使其公开静态,该方法显示了消息对话框?仅调用与UI相关元素的第三个选项,例如ViewModel内部的对话框,似乎违反了MVVM的概念。

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

一些帖子建议使用ViewModel Call CleanUp((,但是您需要以某种方式将消息注册到ViewModel,但是如果您将消息的收件人设置为ViewModel,我尚不清楚如何将ViewModel调用一种非公共静态方法,以更改/显示UI?

我通常使用在IOC容器中注册的视图模型的模式(查看MVVMLIGHT启动器应用程序中的VireModeLocotator类(,并在ViewModeL constructor中注册消息。p>这样,由于IOC处理了ViewModel的创建,因此您对相关视图的多个创建没有任何问题,消息注册仅发生一次。

还要记住,注册和不可分割的消息很容易带您到一个很难找到的世界,您会在发送消息的地方,但由于某种原因没有处理程序注册的喷气机。

我还要补充说,99%的View/ViewModel互动应该发生。

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

最新更新