本文介绍了ItemsControl的拖放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个ItemsControl与绑定到整数的ObservableCollection一个DataTemplate
< ItemsControl的名称=DimsContainer 的ItemTemplate ={StaticResource的DimensionsTemplate}>
< ItemsControl.ItemsPanel>
< ItemsPanelTemplate>
< StackPanel的方向=横向/>
< / ItemsPanelTemplate>
< /ItemsControl.ItemsPanel>
< / ItemsControl的>
和在Windows资源:
< Window.Resources>
<的DataTemplate X:键=DimensionsTemplate>
< TextBlock的文本={结合}
填充=5
VerticalAlignment =中心
字号=32/>
< / DataTemplate中>
< /Window.Resources>
我试图实现与ItemsControl的内拖放项目的能力(即能够重新排序整数)。有没有人对如何做一个简单的例子?我迷上了PreviewMouseMove,的dragenter和Drop事件。问题是,我无法弄清楚如何确定哪个项目被拖动以及它拖动到。如此看来,整个ItemsControl的被传递到事件。
解决方案
下面是一个例子,如何我已经做到了。
XAML:的
< Window.DataContext>
<局部:MyViewModel />
< /Window.DataContext>
<网格和GT;
<&的ScrollViewer GT;
< ListView控件的ItemsSource ={结合迈德特}的HorizontalAlignment =拉伸NAME =列表视图ScrollViewer.PanningMode =VerticalOnly>
< ListView.ItemTemplate>
<&DataTemplate的GT;
<按钮内容={结合}
命令={结合DataContext.MyCommand,的RelativeSource = {的RelativeSource AncestorType =的ItemsControl}
CommandParameter ={结合}
保证金=5 2WIDTH =150HEIGHT =50
字号=30/>
< / DataTemplate中>
< /ListView.ItemTemplate>
< ListView.Resources>
<风格的TargetType =按钮>
< EventSetter事件=PreviewMouseMove处理器=PreviewMouseMove/>
< EventSetter事件=滴处理程序=滴/>
< setter属性=的AllowDropVALUE =真/>
< /样式和GT;
< /ListView.Resources>
< /&的ListView GT;
< /&的ScrollViewer GT;
< /网格和GT;
视图模型:的
类MyViewModel
{
公共MyViewModel()
{
MyCommand =新ICommandImplementation();
}
公众的ObservableCollection<串GT;迈德特
{
得到
{
返回新的ObservableCollection<串>(新的String [] {
一,二,三,四,十二五,六个一,七,八,九,十,
十一,十二条,十三,十四,十五, 十六条,十七,十八,古诗十九首,廿
});
}
}
公众的ICommand MyCommand {搞定;私人集; }
私有类ICommandImplementation:ICommand的
{
公共BOOL CanExecute(对象参数){返回true; }
公共事件的EventHandler CanExecuteChanged;
公共无效执行(对象参数){System.Windows.MessageBox.Show(按钮,点击!+(参数??)的ToString()); }
}
}
活动:
私人无效丢弃(对象发件人,DragEventArgs E)
{
变种来源= e.Data.GetData(源)作为字符串;
如果(来源!= NULL)
{
INT newIndex = listview.Items.IndexOf((发件人为按钮).Content);
无功名单= listview.ItemsSource作为的ObservableCollection<字符串取代;
list.RemoveAt(list.IndexOf(源));
list.Insert(newIndex,源);
}
}
私人无效PreviewMouseMove(对象发件人,MouseEventArgs E)
{
如果(e.LeftButton == MouseButtonState.Pressed)
{
Task.Factory.StartNew(新动作(()=>
{
的Thread.Sleep(500);
App.Current.Dispatcher.BeginInvoke(新操作(()=>
{
如果(e.LeftButton == MouseButtonState.Pressed)
{
VAR数据=新的DataObject();
数据。的SetData(源,(如发送按钮).Content);
DragDrop.DoDragDrop(发件人为DependencyObject的,数据,DragDropEffects.Move);
e.Handled = TRUE;
$} b $ b}),NULL);
}),CancellationToken.None);
}
}
上面的例子是一个有点复杂原因的每一个项目列表
是按钮
和按钮
点击
我也有做一些事情。你的情况是比较容易的。
Here is a relative post.
这篇关于ItemsControl的拖放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!