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);
}
