2015-07-28 3 views
0

Визуальное состояние не изменяется при вызове из обработчика DependencyPropertyChanged в первый раз.Как изменить визуальное состояние от обработчика DependencyPropertyChanged?

Те же визуальные состояния работы при запуске через кнопки мыши или другого события ...

Dependency свойство

 public bool IsSelected 
     { 
      get { return (bool)GetValue(IsSelectedProperty); } 
      set { this.SetValue(IsSelectedProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for IsSelected. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty IsSelectedProperty = 
      DependencyProperty.Register("IsSelected", typeof(bool), typeof(NumericTextBlock), new PropertyMetadata(null, OnIsSelectedChanged)); 

     /// <summary> 
     /// change event handler, fires when IsSelected property changes 
     /// </summary> 
     /// <param name="d"></param> 
     /// <param name="e"></param> 
     private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      NumericTextBlock textBlock = d as NumericTextBlock; 
      if (d != null) 
      { 
       bool isSelected = (bool)(e.NewValue ?? false); 
       if (isSelected) 
       {      
        VisualStateManager.GoToState(textBlock, "Selected", true); 
       } 
       else 
       { 
        if (string.IsNullOrWhiteSpace(textBlock.valueTextBlock.Text)) 
        { 
         VisualStateManager.GoToState(textBlock, "Normal", true); 
        } 
        else 
        { 
         VisualStateManager.GoToState(textBlock, "Edit", true); 
        } 
       } 
      } 
     } 

Установка IsSelected для управления

<custom:NumericTextBlock IsSelected="True"></custom:NumericTextBlock> 

ответ

0

По-видимому, просто нужно было сделать это:

 protected override void OnApplyTemplate() 
     { 
      ... 
      base.OnApplyTemplate(); 
      if (IsSelected) 
      { 
       VisualStateManager.GoToState(this, "Selected", true); 
      } 
     }