2010-08-19 8 views

Antwort

28

Ich habe es selbst herausgefunden, indem ich die Richtlinien im Abschnitt "Hinweise für Vererber" der Dokumentation WeakEventManager befolgte. Hier ist eine grundlegende Implementierung von WeakEventManager. Die Klasse, die das Ereignis beschafft, heißt PropertyValue und das Ereignis heißt 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; 
    } 
} 
+10

Microsoft bietet PropertyChangedEventManager (http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx) und CollectionChangedEventManager (http://msdn.microsoft.com/en-us/ Bibliothek/system.collections.specialized.collectionchangedeventmanager.aspx) in .NET integriert. –

+4

Danke für Ihr Beispiel. Obwohl die kürzere Implementierung '((PropertyValue) -Quelle) ist .Changed + = DeliverEvent;' –

+1

@ Alpha-Maus: Wo genau ist das "schwache" in Ihrer "kürzeren Implementierung"? Ich kann es nicht finden. –

6

Sharp Observation ist ein Open-Source-Projekt, das eine einfach zu bedien Implementierung hat. Vielleicht möchten Sie sich ihren Code ansehen oder ihn einfach so verwenden, wie er ist.

Usage

Die Machschwach() Methode gibt einen neuen delegieren, die die gleiche Ziel wie das ursprüngliche Delegierten aufruft, sondern hält einen schwachen Hinweis auf die Ziel so daß der Zuhörer nicht am Leben gehalten wird, von den Delegierten:

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

Limitations

Die aktuelle Implementierung hat die folgenden Einschränkungen für die Delegierten:

  • Rückgabewerte werden nicht unterstützt.
  • Argumente von Out und Ref werden nicht unterstützt.
Verwandte Themen