WeakEventViewModelBase クラスの実装を見直しました(2020年5月27日)。
サービス層からのプロパティ変更のイベント通知を受け取るビューモデルが必要になったので、以前書いたビューモデルベースを基に弱いイベントパターンを用いたリスナー登録機能を持つビューモデルベースを書いてみました。サービス層からのイベント通知をビューモデルが受け取るということは、サービス層がイベントソース、ビューモデルがイベントリスナになりますが、複数のウィンドウがあるアプリケーションの場合、サービス層(イベントソース)よりもビューモデル(イベントリスナ)のほうが有効期間が短い場合、ビューモデルを破棄しようとしてもサービス層からの強い参照が残っているため、破棄することができません(メモリリーク)。この問題への対応策として弱いイベントパターンがあり、今回はサービス層とビューモデルの間を弱いイベントパターンで結びつけます。なお、メモリリークになるのは、サービス層(イベントソース)よりもビューモデル(イベントリスナ)のほうが有効期間が短い場合なので、サービス層からのイベント通知を受け取るビューモデルの破棄とサービス層の破棄が同じタイミングになる場合には、メモリリークにはなりません。
(2013/12/29 追記)
ソースコードのダウンロードページを作成しました。
WeakEventViewModelBase クラスは、ViewModel クラスから派生させ、IWeakEventListener インターフェイスを実装します。
using System;
using System.Windows;
namespace MakCraft.ViewModels
{
/// <summary>
/// IWeakEventListener インターフェイスを実装したビューモデルベースです。
/// </summary>
public abstract class WeakEventViewModelBase : ViewModelBase, IWeakEventListener
{
/// <summary>
/// コンストラクタ
/// </summary>
public WeakEventViewModelBase() { }
#region IWeakEventListener
/// <summary>
/// イベント マネージャーからイベントを受信します。
/// </summary>
/// <param name="managerType"></param>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <returns></returns>
public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
// PropertyChangedEvent を受信したときの処理を行う。
OnReceivedPropertyChangeNotification(managerType, sender, e);
return true;
}
/// <summary>
/// PropertyChangedEvent を受信したときに実行する仮想メソッドです。
/// </summary>
/// <param name="managerType"></param>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void OnReceivedPropertyChangeNotification(Type managerType, object sender, EventArgs e) { }
#endregion
}
}
次は、このビューモデルベースを用いた簡単なプログラムを掲載しようと思います。
もうひとつ、2画面を持つプログラムでイベントリスナーがイベントソースより先に破棄される状況(通常のイベント通知登録では、メモリリークとなる)で、イベントリスナーが問題なく破棄されることを確認する記事も参考にどうぞ。
「弱いイベントパターンを用いたリスナー登録機能を持つビューモデルベース」への2件のフィードバック