本文介绍了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 ={结合迈德特}的Horizo​​ntalAlignment =拉伸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的拖放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-21 15:27