感谢您的第一反应。我试过了,它奏效了。我没有使用附加行为。我使用了事件触发器。
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;
}
});
}