文章分類/Infragistics
讓我們實現 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(); } }
執行結果
按造上述步驟處理, 您現在可以拖放紀錄了