2011-07-26 10 views
0

閉鎖時に私の子ウィンドウがアンロードされるようにするにはどうすればよいですか?閉鎖時に子ウィンドウをアンロードする(silverlight mvvm)

私はviewmodelからchildwindowを開きますが、閉じた後もコンボボックスではselectionchangedのようなイベントが発生します。

子ウィンドウは、呼び出されたのと同じビューモデルを使用しているので、イベントが発生する理由を説明しています。 itemssourcesはまだ有効です。

しかし、閉鎖されているときは、子ウィンドウを「処分」したいと思います。

私はこの(後ろのデフォルトのビューのコード)のようなクローズハンドラを追加しようとしました:

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; 
    } 

んsucesss ..

をそれでは、私が今やっていることからのItemsSourceを削除することです私のように見える子ウィンドウコントロール...この問題に対する理想的な解決策ではありません。閉じてもメモリからすべてを処分することは可能でなければならないのですか? (Childwindow "ビュー" コードビハインド)

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; 
    } 
+0

http://stackoverflow.com/questions/7036873/when-to-dispose-viewmodel-in-mvvm-light – Kman

答えて

1

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

あなたの意見では、Unloadedイベントに登録する必要があります。そこであなたはあなたの意見であるMessenger.Unregiser(this);と呼んでいます。

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

も参照してください:

MVVM Light Listener not releasing/deterministic finalization for registered object?MVVM Light Messenger executing multiple times

ローレンはこの問題を認識していますが、現在は解決策がありません。

0
  1. ビュー間のviewmodelsを共有するには、このような問題につながることができます。それがめったに行われない理由です。
  2. ViewModelは、理想的な世界では、どのような種類のビューにバインドされているかを知るべきではないため、一般的にナビゲーションには関係しません。これには、子ビューの生成(ChildWindows)が含まれます。

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

+0

viewmodelは、取得されたmvvmlightメッセージを送信するので、子ウィンドウを「認識」していませんデフォルトビューで表示されます。このビューでは、上のコードは(子ウィンドウを開く)から取られています。上のコードはすべてviewmodelではなくviewのコードビハインドからのものです。しかし、デフォルトのビューと子ウィンドウの「ビュー」は、同じビューモデルにリンクされ、「選択されたアイテム」を共有します。 – Kman

+0

Oliver Weichholdへ:経験から...このような動作は、通常、メッセージングが間違っている、つまりメッセージハンドラの登録解除がないことを示します。これはMVVM-Lightの**既知の**動作です。 Oliver Weichholdと@Kmanは私の答えを見ます。 – AxelEckenberger

関連する問題