【问题标题】:MVVM Light Messenger Action Executing Multiple TimesMVVM Light Messenger 动作执行多次
【发布时间】:2012-12-22 07:12:21
【问题描述】:

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

xmlns:interactivity="clr-namespace: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;
            }
        });
    }

【问题讨论】:

    标签: wpf mvvm light messenger


    【解决方案1】:

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

    您可以为此编写附加行为 - 只需注意 unloaded 可能触发的其他原因。一个例子请参见this answer。

    【讨论】:

    • 感谢您的评论。我会尝试并尽快得到结果。
    • 再次感谢。你刚刚给我指明了正确的方向。它确实奏效了。但我没有使用附加行为。我使用 EventTrigger 在 ViewModel 中调用命令取消注册 Messenger。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多