25

.NETのWeakEventManagerを使用した弱いイベントの実装例はありますか?

ドキュメントの「継承者への注意」に従って実装しようとしていますが、あいまいです。たとえば、カスタムマネージャーProtectedAddListenerの静的関数から呼び出す方法がわかりません。AddListener

4

2 に答える 2

28

WeakEventManagerドキュメントの「NotesforInheritors 」セクションのガイドラインに従って、自分でそれを理解しました。これがの基本的な実装ですWeakEventManager。イベントをソーシングするクラスには名前が付けられPropertyValue、イベントには。という名前が付けられChangedます。

public class PropertyValueChangedEventManager : WeakEventManager
{
    public static PropertyValueChangedEventManager CurrentManager
    {
        get
        {
            var manager_type = typeof(PropertyValueChangedEventManager);
            var manager = WeakEventManager.GetCurrentManager(manager_type) as PropertyValueChangedEventManager;

            if (manager == null)
            {
                manager = new PropertyValueChangedEventManager();
                WeakEventManager.SetCurrentManager(manager_type, manager);
            }

            return manager;
        }
    }

    public static void AddListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedAddListener(source, listener);
    }

    public static void RemoveListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedRemoveListener(source, listener);
    }

    protected override void StartListening(object source)
    {
        ((PropertyValue)source).Changed += DeliverEvent;
    }

    protected override void StopListening(object source)
    {
        ((PropertyValue)source).Changed -= DeliverEvent;
    }
}
于 2010-08-19T20:06:14.907 に答える
7

シャープオブザベーションは、使いやすい実装を備えたオープンソースプロジェクトです。それらのコードを確認するか、そのまま使用することをお勧めします。

使用法

MakeWeak()メソッドは、元のデリゲートと同じターゲットを呼び出す新しいデリゲートを返しますが、ターゲットへの弱参照を保持しているため、リスナーはデリゲートによって存続されません。

var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();

制限事項

現在の実装には、デリゲートに対して次の制限があります。

  • 戻り値はサポートされていません。
  • OutとRefの引数はサポートされていません。
于 2011-11-03T10:41:37.690 に答える