技术文章

了解最新技术文章

当前位置:首页>技术文章>技术文章
全部 110 常见问题 0 技术文章 110

拖放的MVVM实现

时间:2023-05-23   访问量:1092

拖放 XamDataGrid 记录

让我们实现 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 ( ) ; _

   }

}

 

 

执行结果

您现在可以拖放记录。


上一篇:更改 UltraGrid 标头的高度

下一篇:获取 igGrid 选定的单元格

发表评论:

评论记录:

未查询到任何数据!

在线咨询

点击这里给我发消息 售前咨询专员

点击这里给我发消息 售后服务专员

在线咨询

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部