让我们实现 XamDataGrid 记录的拖放。单独的 XamDataGrid 不具备拖放功能,但可以结合Infragistics WPF 中包含的Infragistics Drag and Drop Framework来实现。
XamDataGrid 中的记录呈现为 DataRecordPresenters,我们将为 DataRecordPresenters 分配拖放功能。
让我们看看使用 Snoop 的 XamDataGrid。DataRecordPresenter 就在这里。
实施步骤
1. DataRecordPresenter导入模板
将 DataRecordPresenter 的模板引入您的应用程序,添加拖放功能,然后覆盖它。该模板位于以下文件路径中的 DataPresenterGeneric_Express.xaml 中。
C:\Program Files (x86)\Infragistics\2019.1\WPF\DefaultStyles\DataPresenter
→ DataPresenterGeneric_Express.xaml
2.自定义导入模板
将 DragDropManager 设置为 DataRecordPresenter 的 ContentPresenter(x:Name=”PART_RecordContentSite”)。可以通过将 DragSource 的 IsDraggable 设置为 True 来拖动记录。您还可以通过将 DropTarget 的 IsDropTarget 设置为 True 来删除记录。
接下来,处理DragSource的Drop事件,判断被拖动的记录和被拖放的位置,控制记录的位置。在 DataRecordPresenter 的模板中设置 DragDropBehavior(见下文)。
到目前为止的实现对应于下面代码片段中的第 13-24 行。
< Style TargetType = "{x:Type igDP:DataRecordPresenter}" >
...
< Setter属性= "模板" >
< Setter.Value >
< ControlTemplate TargetType = "{x:Type igDP:DataRecordPresenter}" >
< igWindows:CardPanel x:Name = "baseGrid" RenderTransform = "{TemplateBinding FixedNearElementTransform}" Background = "{TemplateBinding Background}" >
<边框x:Name = "addRowFooter" ... />
< Grid Margin = "0" RenderTransform = "{TemplateBinding ScrollableElementTransform}" >
...
< ContentPresenter x:Name = "PART_RecordContentSite" ... >
<!--拖放设置-->
< ig:DragDropManager.DragSource >
< ig:DragSource IsDraggable = "True" >
< i:Interaction.Behaviors >
<!--设置行为-->
<行为:DragDropBehavior />
< /i:Interaction.Behaviors >
</ ig:DragSource >
< /ig:DragDropManager.DragSource >
< ig:DragDropManager.DropTarget >
< ig:DropTarget IsDropTarget = "真" />
< /ig:DragDropManager.DropTarget >
<!--拖放设置-->
</ContentPresenter> _ _
...
</网格> _ _
</ igWindows:CardPanel >
...
</控制模板> _ _
< /Setter.Value >
</二传手> _ _
...
</样式> _ _
3. 实现 DragDropBehavior
接下来,我们将实现在 DragDropBehavior 中放置 DragSource 记录时触发的 Drop 事件。
公共类DragDropBehavior : Behavior < DragSource >
{
受保护的覆盖无效OnAttached ()
{
base.OnAttached ( ) ; _
this . AssociatedObject . Drop += AssociatedObject_Drop;
}
private void AssociatedObject_Drop (对象发送者,DropEventArgs e )
{
System.Diagnostics.Debug.WriteLine (“丢弃” );_ _ _
DragSource dragSource = sender as DragSource;
FrameworkElement fe = dragSource.AssociatedObject as FrameworkElement ;
记录 record = fe.DataContext as Record ;
// 获取 XamDataGrid
XamDataGrid presenter = record.DataPresenter as XamDataGrid ;
// 获取拖动记录
ContentPresenter source = e.DragSource as ContentPresenter ;
DataRecord sourceRecord = source.DataContext as DataRecord ;
int sourceIndex = sourceRecord.Index ;
// 获取掉落记录
ContentPresenter target = e.DropTarget as ContentPresenter ;
DataRecord targetRecord = target.DataContext as DataRecord ;
int targetIndex = targetRecord.Index ;
var dc = presenter.DataContext ;
MainViewModel vm = dc as MainViewModel;
// 重新定位拖动记录
vm.Tasks.Move ( sourceIndex , targetIndex ) ; _
}
受保护的覆盖无效OnDetaching ()
{
this.AssociatedObject.Drop - = AssociatedObject_Drop ; _
base.OnDetaching ( ) ; _
}
}
执行结果
您现在可以拖放记录。