10

Estoy intentando agregar un PropertyChangedCallback a UIElement.RenderTransformOriginProperty. Se produce una excepción cuando intento anular PropertyMetadata.¿Cómo puedo agregar lógica a una devolución de llamada de propiedad de dependencia existente?

He buscado en MSDN y Google, y todo lo que he podido encontrar es this. DependencyPropertyDescriptor.AddValueChanged se sugiere en algún momento de esa publicación, pero eso no resolverá mi problema ya que no se trata de una devolución de llamada por instancia.

No entiendo lo que significa esta excepción en absoluto. ¿Alguien sabe lo que estoy haciendo mal?

public class foo : FrameworkElement 
{ 
    private static void Origin_Changed(DependencyObject d, 
             DependencyPropertyChangedEventArgs e) 
    { } 

    static foo() 
    { 
     PropertyMetadata OriginalMetaData = 
      UIElement.RenderTransformOriginProperty.GetMetadata(
       typeof(FrameworkElement)); 



/*An exception is thrown when this line is executed: 
"Cannot change property metadata after it has been associated with a property"*/ 
     OriginalMetaData.PropertyChangedCallback += 
      new PropertyChangedCallback(Origin_Changed); 



     UIElement.RenderTransformOriginProperty.OverrideMetadata(
      typeof(foo), OriginalMetaData); 
    } 
} 

Respuesta

20

WPF se fusionará los metadatos propiedad para usted cuando llame OverrideMetadata, sin necesidad de pasar que el objeto original de los metadatos. Así que todo lo que tiene que hacer es

UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed))); 

Una cosa a tener en cuenta es a veces el código anterior se produce una excepción. Los dos casos en que eso sucede son

1. Los metadatos originales son una subclase de PropertyMetadata: he visto FrameworkPropertyMetadata y UIPropertyMetadata. Solo tienes que usar el adecuado en cada caso.

2. La propiedad de la dependencia es de solo lectura y no puede hacer nada al respecto.

+0

¡Eso es perfecto! ¡Gracias! Tiendo a asumir que el marco no va a hacer ese tipo de trabajo automáticamente. Supongo que es solo el riesgo ocupacional de ser un ingeniero de bajo nivel en la era del dominio de alto nivel ... – Giffyguy

+0

Hehe, puedo simpatizar con eso. Pasé incontables horas tratando de doblegar a WPF desde la perspectiva de un programador de Win32 cuando no pude encontrar la manera de "cosher" WPF. –

+0

En cuanto a su edición: Oh, dang, eso me saca un poco de velocidad. Tengo que escuchar los cambios en algunas propiedades de dependencia de FrameworkElement de solo lectura, así ... Siendo este el caso, ¿qué sugieres? Realmente, REALMENTE no quiero intentar implementarlo usando AddValueChanged en cada instancia de mi clase. Aunque, supongo que no me importaría, siempre que no tenga ningún impacto en el rendimiento frente a PropertyChangedCallback. Por desgracia, esto tiene que ser eficiente, por supuesto. – Giffyguy

Cuestiones relacionadas