讓我們實現 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)Infragistics2019.1WPFDefaultStylesDataPresenter → 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 Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type igDP:DataRecordPresenter}"><igWindows:CardPanel x:Name="baseGrid" RenderTransform="{TemplateBinding FixedNearElementTransform}" Background="{TemplateBinding Background}"><Border x:Name="addRowFooter" ... /><Grid Margin="0" RenderTransform="{TemplateBinding ScrollableElementTransform}">...<ContentPresenter x:Name="PART_RecordContentSite" ...><ig:DragDropManager.DragSource><ig:DragSource IsDraggable="True"><i:Interaction.Behaviors><behaviors:DragDropBehavior/></i:Interaction.Behaviors></ig:DragSource></ig:DragDropManager.DragSource><ig:DragDropManager.DropTarget><ig:DropTarget IsDropTarget="True"/></ig:DragDropManager.DropTarget></ContentPresenter>...</Grid></igWindows:CardPanel>...</ControlTemplate></Setter.Value></Setter>...</Style>
3. 實現 DragDropBehavior
接下來,我們將實現在 DragDropBehavior 中放置 DragSource 記錄時觸發的 Drop 事件。
public class DragDropBehavior : Behavior{ protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.Drop += AssociatedObject_Drop; } private void AssociatedObject_Drop(object sender, DropEventArgs e) { System.Diagnostics.Debug.WriteLine("Drop"); DragSource dragSource = sender as DragSource; FrameworkElement fe = dragSource.AssociatedObject as FrameworkElement; Record record = fe.DataContext as Record; // XamDataGrid 取得 XamDataGrid presenter = record.DataPresenter as XamDataGrid; // Drag 來源取得 ContentPresenter source = e.DragSource as ContentPresenter; DataRecord sourceRecord = source.DataContext as DataRecord; int sourceIndex = sourceRecord.Index; // Drag 目標取得 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); } protected override void OnDetaching() { this.AssociatedObject.Drop -= AssociatedObject_Drop; base.OnDetaching(); } }
執行結果
按造上述步驟處理, 您現在可以拖放紀錄了