在ItemsControl中WPF中的可拖动对象?

我希望能够实现带有可拖动项目的ItemsControl。 ItemsControl的原因是我可以在后台绑定到我的ViewModel。

我尝试在canvas中使用Thumb控件并且它工作得很完美,除非我将它粘贴在ItemsControl中它就会停止工作。 这是我尝试过的:

            

背后的代码:

  public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); } private void MyThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { Canvas.SetLeft((UIElement)sender, Canvas.GetLeft((UIElement)sender) + e.HorizontalChange); Canvas.SetTop((UIElement)sender, Canvas.GetTop((UIElement)sender) + e.VerticalChange); } 

最后我的ViewModel:

  public class MainViewModel : DependencyObject { public ObservableCollection MyItems { get; set;} public MainViewModel() { MyItems = new ObservableCollection(); MyItems.Add(new Note(){Name="test"}); } } public class Note : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string name; public string Name { get { return name; } set { name = value; if(PropertyChanged!=null) PropertyChanged(this,new PropertyChangedEventArgs("Name")); } } } 

当我在窗口上执行以下操作时,它可以正常工作:

     

但是当我在ItemsControl中使用它时它不再有效。 我假设ItemsControl正在注册鼠标事件并覆盖Thumb?

任何人都有一个很好的解决方案,让这个工作?

本我不认为这种方法起初有效,但经过更多的实验,我得到了它。

问题可以归结为:Canvas.Top和Canvas.Left在项目控件中不起作用。 但你是正确的,风格是解决问题的方法。 这是我提出的解决方案:

                

而代码隐藏:

  public partial class MainWindow : Window { public ObservableCollection Notes { get; set; } public MainWindow() { InitializeComponent(); DataContext = this; Notes = new ObservableCollection(); Notes.Add(new Note(){Title="test", X=100, Y=0}); } private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { Note n = (Note)((FrameworkElement)sender).DataContext; nX += e.HorizontalChange; nY += e.VerticalChange; } } public class Note : INotifyPropertyChanged { private string title; private double x; private double y; public double Y { get { return y; } set { y = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Y")); } } public double X { get { return x; } set { x = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("X")); } } public string Title { get { return title; } set { title = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Title")); } } public event PropertyChangedEventHandler PropertyChanged; 

尝试通过样式设置Canvas绑定属性

  

然后拇指变成: