2012-05-22 19 views
9

Estoy tratando de usar una propiedad adjunta para activar un cambio de estilo en un UIElement cuando se desencadena un evento.Propiedad adjunta para actualizar el desencadenador de estilo en el evento

Aquí es el escenario del caso:

un usuario ve un TextBox, para centrarse luego unfocuses ella. En algún lugar de una propiedad adjunta, se da cuenta de este evento LostFocus y establece una propiedad (¿en algún lugar?) Para decir que es HadFocus.

El estilo en el cuadro de texto luego sabe que debe tener un estilo diferente en función de esta propiedad HadFocus.

Así es como me imagino que el margen de beneficio para mirar ...

<TextBox Behaviors:UIElementBehaviors.ObserveFocus="True"> 
<TextBox.Style> 
    <Style TargetType="TextBox"> 
     <Style.Triggers> 
      <Trigger Property="Behaviors:UIElementBehaviors.HadFocus" Value="True"> 
       <Setter Property="Background" Value="Pink"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</TextBox.Style> 

He intentado un par de combinaciones de las propiedades asociadas a conseguir este trabajo, mi último intento tiros un XamlParseException indicando "La propiedad no puede ser nula en Trigger".

public class UIElementBehaviors 
{ 
    public static readonly DependencyProperty ObserveFocusProperty = 
     DependencyProperty.RegisterAttached("ObserveFocus", 
              typeof (bool), 
              typeof (UIElementBehaviors), 
              new UIPropertyMetadata(false, OnObserveFocusChanged)); 
    public static bool GetObserveFocus(DependencyObject obj) 
    { 
     return (bool) obj.GetValue(ObserveFocusProperty); 
    } 
    public static void SetObserveFocus(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ObserveFocusProperty, value); 
    } 

    private static void OnObserveFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var element = d as UIElement; 
     if (element == null) return; 

     element.LostFocus += OnElementLostFocus; 
    } 
    static void OnElementLostFocus(object sender, RoutedEventArgs e) 
    { 
     var element = sender as UIElement; 
     if (element == null) return; 

     SetHadFocus(sender as DependencyObject, true); 

     element.LostFocus -= OnElementLostFocus; 
    } 

    private static readonly DependencyPropertyKey HadFocusPropertyKey = 
     DependencyProperty.RegisterAttachedReadOnly("HadFocusKey", 
                typeof(bool), 
                typeof(UIElementBehaviors), 
                new FrameworkPropertyMetadata(false)); 

    public static readonly DependencyProperty HadFocusProperty = HadFocusPropertyKey.DependencyProperty; 
    public static bool GetHadFocus(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(HadFocusProperty); 
    } 

    private static void SetHadFocus(DependencyObject obj, bool value) 
    { 
     obj.SetValue(HadFocusPropertyKey, value); 
    } 
} 

¿Alguien me puede indicar?

Respuesta

5

El registro de una propiedad de dependencia de solo lectura no significa agregar Key al nombre de la propiedad. Basta con sustituir

DependencyProperty.RegisterAttachedReadOnly("HadFocusKey", ...); 

por

DependencyProperty.RegisterAttachedReadOnly("HadFocus", ...); 

desde HadFocus es el nombre de la propiedad.

+0

Esa es la solución, gracias por su ayuda: o) – mortware

Cuestiones relacionadas