2010-08-19 12 views

Respuesta

28

Lo descubrí por mi cuenta siguiendo las instrucciones en la sección "Notas para los herederos" de la documentación WeakEventManager. Aquí hay una implementación básica de WeakEventManager. La clase que obtiene el evento se llama PropertyValue y el evento se llama 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 proporciona PropertyChangedEventManager (http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx) y CollectionChangedEventManager (http://msdn.microsoft.com/en-us/ library/system.collections.specialized.collectionchangedeventmanager.aspx) integrado en .NET. –

+4

Gracias por su ejemplo. A pesar de que la implementación más corta será '((PropertyValue) source) .Changed + = DeliverEvent;' –

+1

@ alpha-mouse: ¿Dónde exactamente está el "débil" en su "implementación más corta"? No puedo encontrarlo. –

6

Sharp Observation es un proyecto de código abierto que tiene una aplicación fácil de usar. Es posible que desee echar un vistazo a su código o simplemente usarlo tal como está.

Usage

El método MakeWeak() devuelve un nuevo delegado que invoca el mismo objetivo como el delegado original, pero tiene una débil referencia al objetivo para que el oyente no se mantiene viva por el delegado:

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

Limitations

La implementación actual tiene las siguientes restricciones a los delegados:

  • Valores de retorno no son compatibles.
  • Los argumentos de Out y Ref no son compatibles.
Cuestiones relacionadas