0

最初の応答をありがとう。私は試してみましたが、うまくいきました。添付の動作は使用しませんでした。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;
            }
        });
    }
4

1 に答える 1

0

ビュー モデルでは、意味がある場合はいつでも登録を解除する必要があります。バインドされているコントロールがアンロードされたときに、これを実行したいと思うでしょうか?

このために付加されたビヘイビアーを書くことができます - unloaded が起動する可能性がある他の理由に注意してください。一例として、この回答を参照してください。

于 2012-12-22T12:41:12.673 に答える