MVVM Light Messenger动作执行多次

时间:2012-12-22 07:12:22

标签: wpf mvvm light messenger

感谢您的第一反应。我试过,它有效。我没有使用附加行为。我使用了EventTrigger。

的xmlns:交互= “CLR-名称空间:System.Windows.Interactivity;装配= System.Windows.Interactivity”

<interactivity:Interaction.Triggers>
    <!-- In order to Call Cleanup in ViewModel to unregister Messenger.  -->
    <interactivity:EventTrigger EventName="Unloaded">
        <interactivity:InvokeCommandAction Command="{Binding ViewUnloadCommand}" />
    </interactivity:EventTrigger>
</interactivity:Interaction.Triggers>

然后我的视图将调用ViewModel中的命令,以便在卸载此视图时取消注册Messenger。

再次感谢。


感谢Laurent对MVVM光的出色工作。

我一直在使用这个框架开发一个WPF项目。然后我遇到了这个问题。我试图在Google,MSDN和StackOverFlow上搜索它。在ViewModel和View之间使用Messgener时,我找到了这个解决方案。我会在CodeBehind文件中执行类似的操作,在Unloaded事件处理程序中调用Unregister。

    public FinishedTodoItemTreeViewUserControl()
    {
        InitializeComponent();

         Messenger.Default.Register<DialogMessage>(this, FinishedTodoItemTreeViewModel.DeleteAllDoneItemsConfirmMessageToken, dialog =>
        {
            var confirmResult = MessageBox.Show(dialog.Content, dialog.Caption, dialog.Button, dialog.Icon);
            dialog.ProcessCallback(confirmResult);
        });
    }

    private void currentControl_Unloaded(object sender, RoutedEventArgs e)
    {
         Messenger.Default.Unregister(this);
    }

但是当我在ViewModel中执行此操作时,我应该调用Unregister或Cleanup?因为我仍然需要在它发生时再次收到此消息。但我不希望只用一次拍摄多次收到此消息。

提前致谢。

    /// <summary>
    /// Register to be observer of TodoItems change notification receiver.
    /// </summary>
    private void RegisterTodoItemsChangedNotification()
    {
         Messenger.Default.Register<UnfinishedTodoItemTreeViewModel>(this, UnfinishedTodoItemTreeViewModel.RelatedTodoItemsChangedMessageToken, itemTreeViewModel =>
        {
            if (itemTreeViewModel.ActionCategory == UnfinishedTodoItemTreeViewModel.TodoItemActionCategory.Done)
            {
                DecreaseRelatedFilterTodoItemCount(itemTreeViewModel.FilterType);
                AllTodoItemCount -= 1;
            }
            else if (itemTreeViewModel.ActionCategory == UnfinishedTodoItemTreeViewModel.TodoItemActionCategory.Undone)
            {
                IncreaseRelatedFilterTodoItemCount(itemTreeViewModel.FilterType);
                AllTodoItemCount += 1;
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

在视图模型中,只要有意义,就应取消注册。我猜你在卸载绑定的控件时会想要这样做吗?

您可以为此编写附加行为 - 只需了解卸载可能触发的其他原因。有关示例,请参阅this answer