2014-10-17 31 views
0

我已经添加了自定义的拖动行为给TextBlock网格上如何绑定到translatetransform

的XAML

<Grid> 
    <TextBlock Text="{Binding Description}" > 
     <i:Interaction.Behaviors> 
      <flowfieldVisualiser:DragBehavior/> 
     </i:Interaction.Behaviors>   
    </TextBlock> 
</Grid> 

的行为

public class DragBehavior : Behavior<UIElement> 
    { 
     private Point _elementStartPosition; 
     private Point _mouseStartPosition; 
     private readonly TranslateTransform _transform = new TranslateTransform(); 

     protected override void OnAttached() 
     { 
      AssociatedObject.RenderTransform = _transform; 
      AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown; 
      AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp; 
      AssociatedObject.MouseMove += AssociatedObject_MouseMove; 
     } 

     void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var parent = Application.Current.MainWindow; 
      _elementStartPosition = AssociatedObject.TranslatePoint(new Point(), parent); 

      var vector = e.GetPosition(parent) - _elementStartPosition; 
      _mouseStartPosition = new Point(vector.X, vector.Y); 

      AssociatedObject.CaptureMouse(); 
     } 

     void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      var parent = Application.Current.MainWindow; 
      _elementStartPosition = AssociatedObject.TranslatePoint(new Point(), parent); 
      var diff = e.GetPosition(parent) - _mouseStartPosition; 
      if (AssociatedObject.IsMouseCaptured) 
      { 
       _transform.X = diff.X; 
       _transform.Y = diff.Y; 
      } 
     } 

     void AssociatedObject_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      AssociatedObject.ReleaseMouseCapture(); 
     } 
    } 

该作品的代码好吧,我可以拖动文本框。问题是,我需要知道我的datacontext中的新值是什么。如何将TranslateTransform x和y绑定到我的数据上下文的x和y属性?

回答

0

这里是一个示例

Binding bindingX = new Binding("DataContext.X"); 
    bindingX.Source = AssociatedObject; 
    bindingX.Mode = BindingMode.OneWayToSource; 
    BindingOperations.SetBinding(_transform, TranslateTransform.XProperty, bindingX); 

假设DataContext视图模型是具有属性命名X上面的代码将设置_transform的结合为TranslateTransform.XProperty,这将值推到源结合这是AssociatedObject的DataContext.X。因此将价值推向VM的财产。

您可能还需要为Y属性设置相同的值。

有关信息UIElement没有DataContext,所以除非AssociatedObject的类型为FrameworkElement以上可能无法按预期工作。

你也可以改变同样以Behavior<FrameworkElement>更好的可靠性

+0

谢谢您的回答,但我会怎么做,通过XAML?在自定义行为中添加绑定感觉不对,我不想绑定到我仍然想要移动的其他控件。 – 2014-10-17 08:27:43

+0

@JohnPetrak,由于要绑定的源(tansform)不在xaml中,因此可能无法在xaml中完成。但是,您可以使用其他附加行为来绑定相同的行为。顺便说一句,行为绑定没有任何错误,但具有不同的行为可能会帮助你分离代码。 – pushpraj 2014-10-17 08:36:07