XamDataCards のカードをドラッグアンドドロップして位置を入れ替えるサンプルです。

XamDataCards のカードを表現している Border 要素(x:Name=”Bd”)に、Infragistics Drag and Drop フレームワークを組み込んでいます。

<Style TargetType="{x:Type igDP:CardViewCard}">
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type igDP:CardViewCard}">
                <Border x:Name="Bd"
                    ...>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        ...
                    </Grid>
                    <--追加-->
                    <ig:DragDropManager.DragSource>
                        <ig:DragSource IsDraggable="True" Drop="DragSource_Drop" />
                    </ig:DragDropManager.DragSource>
                    <ig:DragDropManager.DropTarget>
                        <ig:DropTarget IsDropTarget="True" />
                    </ig:DragDropManager.DropTarget>
                    <--追加-->
                </Border>
                <ControlTemplate.Triggers>
                    ...
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

これでカードをドラッグアンドドロップできるようになります。ドロップしたタイミングで DragSource.Drop イベントをハンドルしてカードの位置を入れ替えます。

private void DragSource_Drop(object sender, Infragistics.DragDrop.DropEventArgs e)
{
    // ドラッグしたカード
    var draggedCard = e.DragSource as Border;
    // ドロップされたカード
    var droppedCard = e.DropTarget as Border;
    // カードにバインドされているデータ
    var draggedEmployee = (draggedCard.DataContext as DataRecord).DataItem as Employee;
    var droppedEmployee = (droppedCard.DataContext as DataRecord).DataItem as Employee;

    var employees = this.DataContext as ObservableCollection<Employee>;
    var index = employees.IndexOf(droppedEmployee);
    
    // カードデータの入れ替え
    employees.Remove(draggedEmployee);
    employees.Insert(index, draggedEmployee);
}
Tagged: