0

ウィンドウがインスタンス化され、メソッドの範囲内で開かれる WPF/MVVM アプリケーションには、いくつかのシナリオがあります。非常に単純な例:

Private Sub subOpenWindow
    Dim myViewModel = New Viewmodel1 'create viewmodel that Window1 will use as datacontext
    AddHandler myViewModel.SomeEvent, AddressOf subHandleSomeEvent

    Dim myWindow = New Window1(ViewModel1)
    myWindow.Show
End Sub

Private Sub subHandleSomeEvent
 'do some stuff
End Sub

現在 - AddHandler 宣言が宣言されて subOpenWindow メソッド内で使用され、明確な手段がないことを考えると、後続の RemoveHandler なしで AddHandler を使用すると (通常は大したことではありません)、メモリの問題が発生するかどうかについて議論しています。 RemoveHandler 呼び出しの実行。ビューモデル宣言をよりグローバルなレベルに移動することもできますが、これはきれいに見えません。

問題は、このシナリオで RemoveHandler が必要かどうかです。または、ウィンドウが閉じられると、ガベージ コレクションは適切にクリーンアップされますか?

4

1 に答える 1

0

Window の Closed イベントを処理して、ハンドラーを削除できます。現状では、現在のクラス (ハンドラーを含むクラス) によって作成された参照は、実際に myViewModel をメモリに保持します。別の方法は、弱いイベントの使用を検討することです。詳細については、こちらを参照してください。

于 2010-09-25T12:00:26.663 に答える