mvvm light v3取消注册是否正常工作?

Pet*_*ele 1 mvvm-light

MvvM-Light v3取消注册有问题吗?

我正在注册这样的:

 Messenger.Default.Register<DialogResponse>(this,
                                            MessageTypesUI.YesNoQueryResponse,
                                            AnswerResponse);
Run Code Online (Sandbox Code Playgroud)

然后在"AnswerResponse"

 Messenger.Default.Unregister<DialogResponse>(MessageTypesUI.YesNoQueryResponse);
Run Code Online (Sandbox Code Playgroud)

两个方法都执行,并且调用AnswerResponse,但第二次调用它两次,第三次调用三次,等等.

它就像我的"取消注册"被忽略一样.

我用Unregister()和普通的Unregister()尝试了它

V4的发行说明中有一些内容让我怀疑版本3取消注册有问题...

Axe*_*ger 6

您应该修改对取消注册的调用以传入收件人对象,而不是消息类型:

Messenger.Default.Unregister<DialogResponse>(this);
Run Code Online (Sandbox Code Playgroud)

如果您查看Messenger 的MVVM Light代码,则所有取消注册操作都将使用收件人 - 因为内部收件人用于标识将删除哪些邮件处理程序.最基本的方法是Unregister(recipient)取消注册给定收件人的所有操作.所有其他参数允许更细粒度的方法.

如果您有多个操作处理相同的消息类型,并且您只想取消注册其中一个,则可以使用

Messenger.Unregister<DialogMessage>(recipient, action);
Run Code Online (Sandbox Code Playgroud)

仅删除其中一个操作.

编辑

针对V. 4的MVVM Light发行说明表明对Messenger的以下更改:

  1. 缺少添加到的方法.IMessenger界面.
  2. 添加了允许使用令牌进行过滤的其他取消注册方法.
  3. Messenger.CleanupList方法是线程安全的.

  • 接受答案仍然很好...... :-) (2认同)