最初の応答をありがとう。私は試してみましたが、うまくいきました。添付の動作は使用しませんでした。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 を登録解除します。
再度、感謝します。
MVVM light に関するすばらしい作業をしてくれた Laurent に感謝します。
このフレームワークを使用して WPF プロジェクトに取り組んできました。その後、この問題に遭遇しました。Google、MSDN、StackOverFlow で検索してみました。ViewModel と View の間で Messgener を使用すると、この解決策が見つかりました。Unloaded イベント ハンドラーで Unregister を呼び出すために、CodeBehind ファイルでこのようなことを行います。
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 を呼び出す必要がありますか? それが起こったとき、私はまだこのメッセージをもう一度受け取る必要があるからです. しかし、このメッセージを 1 回のショットで何度も受信したくありません。
前もって感謝します。
/// <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;
}
});
}