2013-09-23 1 views
0

visiblox 차트에 대한 사용자 지정 동작을하고 있습니다. 이 사용자 지정 동작에는 차트의 세로 선 그리기로 구성된 커서의 위치를 ​​식별하는 종속성 속성 값이 있습니다. FollowMouse 속성을 true로 설정하면이 커서가 마우스를 따라 이동합니다.wpf twoway bound DependencyProperty setcurrentvalue가 작동하지 않습니다.

Value 속성을 바인딩하면 changedvaluallback은 newValue로만 0을 얻고, 값이 바인딩되지 않으면 제대로 작동합니다. 하지만 바인딩 (ViewModel의 속성) 소스 속성을 변경하면 너무 작동합니다. 그래서 문제는 PointerMoved에서 SetCurrentValue로 값을 설정하는 것입니다. 여기

은 행동의 소스 코드 :

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

값 종속성 속성에 대한 바인딩을 정의하고 새 값 (명시 적으로)이 무엇이든간에 ValueProperty를 설정하려고합니까? –

+0

예, 있습니다. ViewModel에서 속성 값을 변경하면 모든 것이 잘 동작합니다. 문제는 SetCurrentValue 메서드가있는 내부에서 ValueProperty를 설정하는 것입니다. – maykonvs

답변

0

발견.

ViewModel의 내 속성은 10 진수이며 아래 줄에서 반환되는 속성은 double입니다.

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

변환기를 모든 요소가 예상대로 작동하는 바인딩에 추가했습니다.

관련 문제