0

childwindow が閉じられたときに確実にアンロードされるようにするにはどうすればよいですか?

ビューモデルから子ウィンドウを開いていますが、閉じた後も、コンボボックスで selectionchanged などのイベントが発生します。

childwindow は、呼び出されたのと同じビューモデルを使用しているため、イベントが発生する理由はそれで説明できると思います。アイテムソースは引き続き有効です。

しかし、閉じたら、子ウィンドウを永久に「処分」したいと思います。

このような Closed ハンドラーを追加しようとしました (デフォルト ビュー コード ビハインド):

    private void OnLaunchEditItem(ItemMessage msg)
    {
        var editWnd = new EditItemWindow();
        editWnd.Closed += new EventHandler(editWnd_Closed);
        editWnd.Show();
    }

    void editWnd_Closed(object sender, EventArgs e)
    {
        sender = null;
    }

成功なし..

だから私が今やっているのは、アイテムソースを子ウィンドウコントロールから削除することです。これは私には思えます...問題の理想的な解決策ではありません。閉じるときにメモリからすべてを破棄できるはずですか? (子ウィンドウの「表示」コード ビハインド)

    private void OKButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }
4

2 に答える 2

1

メッセージングには、メッセンジャーとメッセージの受信者との間にハードリンクが生じるという既知の問題があります。したがって、メッセージングを使用する場合は、Messenger.Unregisterメソッドが呼び出されることを確認する必要があります。つまり、メッセージを処理するために呼び出すときはRegister、必ず呼び出しUnregisterも行うようにしてください。

したがって、あなたの見解では、Unloadedイベントに登録する必要があります。Messenger.Unregiser(this);そこで、これがあなたの見解である場所を呼び出します。

CleanupViewModelでは、ViewModel をメッセージ受信者として登録解除するためにメソッドが呼び出されることを確認する必要があります。

以下も参照してください。

MVVM Light Listener は、登録されたオブジェクトの決定論的なファイナライズを解放しませんか? およびMVVM Light Messenger が複数回実行されます。

Laurent はこの問題を認識していますが、現時点では解決策がありません。

于 2011-07-30T06:07:57.960 に答える
0
  1. ビュー間で ViewModel を共有すると、このような問題が発生する可能性があります。そのため、行われることはほとんどありません。
  2. ViewModel は通常、ナビゲーションに関係する必要はありません。理想的な世界では、ViewModel がバインドされているビューの種類さえ認識してはならないからです。これには、子ビュー (ChildWindows) の生成が含まれます。

2 つの変更をお勧めします。1 つ目は、ダイアログ専用のビューモデルを作成することです。次に、ナビゲーションをコントローラーに委譲することで、ビューモデルからナビゲーションを分離します。MVVM のコントローラーは通常、ウィンドウやダイアログなどを開くことだけを目的としたシングルトン オブジェクトです。これは、非常にエレガントな方法でイベント アグリゲーター パターンを使用して実装できます。

于 2011-07-26T17:47:38.517 に答える