0

マスターウィンドウと、マスター ウィンドウのデータグリッド内の特定の行をダブルクリックして開く詳細ウィンドウの 2 つのウィンドウがあります。詳細ウィンドウのデータを保存するときに、マスター ウィンドウのデータグリッド コントロールを更新したいと考えています。

(いくつかの無関係な詳細: 各ウィンドウはBaseWindowクラスから継承し、 EF5 から継承するクラスの独自のコピーを持っていますDbContext。部分クラスにイベントを追加し、呼び出されるたびにこのイベントを発生させるようSaveにオーバーライドしました。それは実際にはイベントハンドラーをアタッチしています。)SaveChangesSaveChanges

イベントにイベント ハンドラーをアタッチすることで、これを実行できることはわかっていますSave。ただし、ウィンドウがどの順序で閉じられるかはわかりません。マスターウィンドウが最初に閉じられた場合、詳細ウィンドウのインスタンスによって保持される参照が引き続き存在します。

マスター ウィンドウのイベントをリッスンしてClosing'/'Closed、「保存」イベントに関連付けられたハンドラーをいつ解放するかを判断できるようにすると、逆に同じ問題が発生します。マスター ウィンドウは、その後でも詳細ウィンドウへの参照を保持します。詳細ウィンドウが閉じます。

hereWeakEventManagerで説明されているように実装できることは承知していますが、使用できるより簡単な手法があるかどうかを知りたいです。(物事を複雑にしすぎる傾向があると言われています。)

(私はMVVMを使用していません。)

4

1 に答える 1

0

WeakEventManager汎用バージョンを使用するだけで、複雑なことは何もありません。あなたの場合、完全にうまくいくはずのパフォーマンスが賢明です。

別のオプションは、あなたが言ったように、マスターウィンドウのイベントハンドラーをClosingマスターウィンドウからサブスクライブ解除することです。

詳細ウィンドウが閉じられたときにすべての参照を削除するには、詳細ウィンドウが閉じられたときに、このメソッドをClosingイベントにサブスクライブして、詳細ウィンドウ内からすべてのイベント ハンドラーのサブスクライブを解除します。

public OnClosing()
{       
    Delegate[] registeredDelegates = saveHandler.GetInvocationList();
    foreach (Delegate d in registeredDelegates )
       saveHandler-= (d as SaveDelegate);
}

ここで、saveHandler はハンドラーで、SaveDelegate はカスタム デリゲート タイプです。

そうは言っても、過度に複雑なイメージを取り除きたい場合は、気にしないでください...

于 2013-04-08T08:59:40.300 に答える