2013-09-23 4 views
0

Я работаю над пользовательским поведением для диаграммы visiblox. Это настраиваемое поведение имеет свойство зависимости Value, которое идентифицирует позицию курсора, которая состоит из вертикальной линии на диаграмме. Этот курсор следует за мышью, если я устанавливаю свойство FollowMouse в значение true.wpf twoway bound DependencyProperty setcurrentvalue не работает

Если я привязываю свойство Value, значение changevaluecallback получает 0 только как newValue, а если значение не привязано, оно работает правильно. Но если я изменяю свойство source привязки (свойство в ViewModel), оно тоже работает. Поэтому проблема заключается в установке значения с помощью SetCurrentValue в PointerMoved.

Вот исходный код поведения:

public class TimeCursorBehavior : BehaviourWithAxesBase 
    { 

     private System.Windows.Shapes.Line _line; 

     public TimeCursorBehavior() 
      : base("TimeCursor") 
     { 
      _line = new System.Windows.Shapes.Line(); 
      _line.Stroke = System.Windows.Media.Brushes.Black; 
      _line.StrokeThickness = 2; 
     } 

     public override void DeInit() 
     { 
      base.DeInit(); 

      Chart.BehaviourCanvas.Children.Remove(_line); 
     } 

     protected override void Init() 
     { 
      base.Init(); 

      Chart.BehaviourCanvas.Children.Add(_line); 
     } 

     public override void PointerMoved(IBehaviourEventSource sender, PointerEventContext context) 
     { 
      base.PointerMoved(sender, context); 

      if (!FollowMouse) 
       return; 

      IComparable xDataValue = XAxis.GetRenderPositionAsDataValueWithZoom(context.Point.X); 

      SetCurrentValue(ValueProperty, xDataValue); 
     } 

     public override void BehaviourCanvasSizeChanged(IBehaviourEventSource sender, SizeChangedEventArgs e) 
     { 
      base.BehaviourCanvasSizeChanged(sender, e); 

      _line.Y2 = e.NewSize.Height; 
     } 

     #region Value 

     public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(IComparable), typeof(TimeCursorBehavior), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged)); 

     private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
     { 
      (sender as TimeCursorBehavior).OnValueChanged(args.OldValue as IComparable, args.NewValue as IComparable); 
     } 

     private void OnValueChanged(IComparable oldValue, IComparable newValue) 
     { 
      if (XAxis == null) 
       return; 

      double x = XAxis.GetDataValueAsRenderPositionWithZoom(newValue); 
      _line.X1 = x; 
      _line.X2 = x; 
     } 

     public IComparable Value 
     { 
      get 
      { 
       return GetValue(ValueProperty) as IComparable; 
      } 
      set 
      { 
       SetValue(ValueProperty, value); 
      } 
     } 

     #endregion 

     #region FollowMouse 

     public static readonly DependencyProperty FollowMouseProperty = DependencyProperty.Register("FollowMouse", typeof(bool), typeof(TimeCursorBehavior), new PropertyMetadata(false)); 

     public bool FollowMouse 
     { 
      get 
      { 
       return (bool)GetValue(FollowMouseProperty); 
      } 
      set 
      { 
       SetValue(FollowMouseProperty, value); 
      } 
     } 

     #endregion 

    } 

Кто-нибудь знает, почему SetCurrentValue не обновляет значения соответственно?

+0

Вы определили привязку к свойству зависимостей Value и пытаетесь ли вы установить ValueProperty с тем, что является новым значением (явно)? –

+0

Да, я. Если я изменю значение свойства в ViewModel, все будет хорошо. Проблема заключается в установке ValueProperty внутри поведения с помощью метода SetCurrentValue. – maykonvs

ответ

0

Обнаружена проблема.

Мое свойство в ViewModel является десятичным, а свойство, возвращаемое строкой ниже, является двойным.

IComparable xDataValue = XAxis.GetRenderPositionAsDataValueWithZoom(context.Point.X); 

Я добавил конвертер к привязке, все работало, как ожидалось.

Смежные вопросы