0

感谢您的第一反应。我试过了,它奏效了。我没有使用附加行为。我使用了事件触发器。

xmlns:interactivity="clr-命名空间:System.Windows.Interactivity;assembly=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 light 上所做的出色工作。

我一直在使用这个框架开发一个 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;
            }
        });
    }
4

1 回答 1

0

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

您可以为此编写附加行为 - 只需注意 unloaded 可能触发的其他原因。例如,请参阅此答案

于 2012-12-22T12:41:12.673 回答