2010-03-16 7 views
11

Tengo la siguiente propiedad de dependencia dentro de una clase:Conseguir este puntero dentro de la propiedad de dependencia cambió de devolución de llamada

class FooHolder 
{ 
    public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
     "CurrentFoo", 
     typeof(Foo), 
     typeof(FooHandler), 
     new PropertyMetadata(OnCurrentFooChanged)); 

    private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     FooHolder holder = (FooHolder) d.Property.Owner; // <- something like this 

     // do stuff with holder 
    } 
} 

Tengo que ser capaz de recuperar una referencia a la instancia de la clase a la que pertenece la propiedad cambiada.

Esto es desde FooHolder tiene algunos controladores de eventos que deben engancharse/desengancharse cuando se cambia el valor de la propiedad. La devolución de llamada cambiada de propiedad debe ser estática, pero el controlador de eventos no lo es.

Respuesta

17

Algo como esto: (usted tiene que definir UnwireFoo() y WireFoo() usted mismo)

private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    FooHolder holder = (FooHolder)d; // <- something like this 

    holder.UnwireFoo(e.OldValue as Foo); 
    holder.WireFoo(e.NewValue as Foo); 
} 

Y, por supuesto, FooHolder debe heredar de DependencyObject

+0

Y yo que estaba buscando en torno a las propiedades en el interior * * d, tal vez fue a obvia. ¡Gracias! – Mizipzor

+0

1000 gracias por este ... Simplemente fui a un viaje de 16 horas para encontrar lo obvio .. La documentación de MSDN parece escrita por Sir Humphrey Appleby .. –

3

El dueño de la propiedad siendo modificado el parámetro d de su método de devolución de llamada

3

Basado en la respuesta de @ catalin-dicu, agregué este método de ayuda a mi biblioteca. Se sintió un poco más natural tener el método OnChanged no es estático y ocultar todo el casting.

static class WpfUtils 
{ 
    public static DependencyProperty RegisterDependencyPropertyWithCallback<TObject, TProperty>(string propertyName, Func<TObject, Action<TProperty, TProperty>> getOnChanged) 
     where TObject : DependencyObject 
    { 
     return DependencyProperty.Register(
      propertyName, 
      typeof(TProperty), 
      typeof(TObject), 
      new PropertyMetadata(new PropertyChangedCallback((d, e) => 
       getOnChanged((TObject)d)((TProperty)e.OldValue, (TProperty)e.NewValue) 
      )) 
     ); 
    } 
} 

Ejemplo de uso:

class FooHolder 
{ 
    public static DependencyProperty CurrentFooProperty = WpfUtils.RegisterDependencyPropertyWithCallback 
     <FooHolder, Foo>("CurrentFoo", x => x.OnCurrentFooChanged); 

    private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo) 
    { 
     // do stuff with holder 
    } 
} 
Cuestiones relacionadas