Pregunta

Me he topado con un problema extraño con las propiedades adjuntas, donde cuando asigno el nombre de la propiedad en la llamada a RegisterAttached y nombre correctamente el nombre de la propiedad adjunta (por ejemplo, TranslateProperty y " Translate ") el código de la adjunta La implementación de la propiedad no se dispara. Simplemente no se llama. Si cambio el nombre de la cadena a otro que no sea Traducir (por ejemplo, " Traducir_ "), el código se considera correcto.

Aquí está la implementación:

clase pública TranslateExtension: DependencyObject {

public static readonly DependencyProperty TranslateProperty =
    DependencyProperty.RegisterAttached("Translate_",
                                        typeof(bool),
                                        typeof(TranslateExtension),
                                        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));

public static void SetTranslate(UIElement element, bool value)
    {
        AssignKeys(element);
        element.SetValue(TranslateProperty, value);
    }
    public static bool GetTranslate(UIElement element)
    {
        return (bool)element.GetValue(TranslateProperty);
    }

    public bool Translate
    {
        set { base.SetValue( TranslateProperty,  value); }
    }
   ...
}

Lo anterior realmente funciona porque la propiedad en la cadena es Translate_. Si cambio el valor de la cadena a " Traducir " falló.

Tengo otras 2 propiedades adjuntas en la misma clase y muestran exactamente el mismo comportamiento: el mismo nombre que AttachedProperty y no se llaman. Nombra algo más y funciona.

No estoy seguro de lo que está pasando aquí. Mi código realmente funciona con los nombres no válidos, pero no entiendo por qué, y lo que es más importante, no estoy seguro de que esta denominación incorrecta cause algún efecto secundario.

¿Alguien puede ver si estoy pasando por alto algo dolorosamente obvio? He revisado algunos ejemplos en artículos de AttachedProperties y no veo esas implementaciones usando nombres especiales; siempre nombran la propiedad de cadena igual que las propiedades adjuntas.

¿Fue útil?

Solución

No debes poner código extra en tu SetTranslate ya que no se llamará. Desde MSDN aquí :

  

Implicaciones para las propiedades de dependencia personalizadas

     

Debido a la implementación actual de WPF   del comportamiento del procesador XAML para   configuración de la propiedad pasa por alto los contenedores   enteramente, no debes poner ninguna   lógica adicional en el conjunto   definiciones de la envoltura para su   Propiedad de dependencia personalizada. Si pones   tal lógica en la definición del conjunto, entonces   la lógica no se ejecutará cuando   la propiedad se establece en XAML en lugar   que en el código.

     

Del mismo modo, otros aspectos de la XAML.   Procesador que obtiene valores de propiedad.   Del procesamiento XAML también usamos GetValue   En lugar de utilizar el envoltorio.   Por lo tanto, también debe evitar cualquier   Implementación adicional en el get.   definición más allá de la llamada GetValue.

En su lugar, agregue un PropertyChangedCallback a su FrameworkPropertyMetadata.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top