2012-05-22 12 views
9

Próbuję użyć załączonej właściwości, aby wywołać zmianę stylu na UIElement po uruchomieniu zdarzenia.Załączona właściwość w celu aktualizacji wyzwalacza stylu dla zdarzenia

Oto scenariusz:

Użytkownik widzi TextBox i skupia następnie unfocuses go. Gdzieś w załączonej nieruchomości zauważa to zdarzenie LostFocus i ustawia właściwość (gdzieś?), Aby powiedzieć, że to HadFocus.

Styl w TextBox wie, że powinien się inaczej stylizować w oparciu o tę właściwość HadFocus.

Oto jak sobie wyobrazić znaczników spojrzeć ...

<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> 

Próbowałem kilka kombinacji dołączonych właściwości uzyskać tej pracy, moja najnowsza próba rzuca XamlParseException stwierdzając "Właściwość nie może mieć wartości NULL dla wyzwalacza".

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); 
    } 
} 

Czy ktoś jest w stanie mi pomóc?

Odpowiedz

5

Rejestracja właściwości zależności tylko do odczytu nie oznacza dodania Key do nazwy właściwości. Wystarczy zastąpić

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

przez

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

od HadFocus to nazwa nieruchomości.

+0

To jest poprawka, dziękuję za pomoc: o) – mortware

Powiązane problemy