文章分類/

Infragistics|Ultimate UI WPF|拖放 XamDataGrid 記錄

0 次瀏覽
2023-03-13 更新

infragistics log

讓我們實現 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();
    }
}

執行結果

按造上述步驟處理, 您現在可以拖放紀錄了

快速跳轉目錄

✦ 群昱 AccessSoft 你的全面軟體解決方案 ✦

身為全球眾多知名軟體在台灣合作夥伴,歡迎諮詢你需要的軟體服務!

Picture of 軟體專家
軟體專家

群昱作為全球知名軟體推薦合作夥伴,致力於提供更多軟體解決方案給你!

更多軟體新知

立即詢價

請留下完整資訊,以便我們提供精確的服務內容給你。

詢價資訊