1

シンプルなViewModelがあります

    public class TestViewModel : ViewModelBase, IDisposable
    {

    public TestViewModel()
    {
        Messenger.Default.Register<string>(this, MessageHandling);
    }

    public void MessageHandling(string message)
    {
        System.Windows.MessageBox.Show(message);
    }
    public override void Cleanup()
    {
        Messenger.Default.Unregister(this);
        base.Cleanup();
    }
    }

そして、私は次のようにXAMLで使用します。

   <Window.Resources>
    <ResourceDictionary>
        <vm:TestViewModel x:Key="ViewModel"></vm:TestViewModel>
    </ResourceDictionary>
   </Window.Resources>
   <Grid DataContext="{Binding Source={StaticResource ViewModel}}">
   </Grid>

誰かがこのViewModelの破棄を手伝ってくれますか?つまり、VMメソッドのクリーンアップを呼び出すためにサブスクライブする必要があるイベントを破棄することによってできますか?クリーンアップを行わないと、ViewModelはメモリに残り、メッセージを処理するためです。私はそれを正しく説明したと思います:)

前もって感謝します

4

2 に答える 2

2

まず第一に、あなたがそれをいつ処分したいかはあなた次第です。あなたはそれを明確にしませんでした。私は最初、「アプリケーションが閉じたとき」という意味だと思ったので、exitイベントを使用します。しかし、私はあなたの発言にイライラしました

クリーンアップを行わないと、ViewModelはメモリに残り、メッセージを処理するためです。きちんと説明できたらいいのに

破棄したいが、アプリケーションを実行する必要がある場合にのみ発生する可能性があります。アプリケーションを閉じると、メモリに何も残らず、メッセージは処理されなくなります。しかし、それに依存しないことは依然として良い習慣です。

したがって、「アプリケーションが閉じたとき」を意味する場合、これがあなたの答えです。

于 2012-08-04T10:26:25.020 に答える
0

登録解除を行ってもMessengerが強力な参照を生成する理由と回避策についての説明があります。

FrameworkElement( "View")は、アンロードが発生したときにViewModelのクリーンアップを呼び出すことができます。

于 2012-08-04T11:26:39.913 に答える