感谢您的第一反应。我试过,它有效。我没有使用附加行为。我使用了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;
}
});
}
答案 0 :(得分:0)
在视图模型中,只要有意义,就应取消注册。我猜你在卸载绑定的控件时会想要这样做吗?
您可以为此编写附加行为 - 只需了解卸载可能触发的其他原因。有关示例,请参阅this answer。