WPF DataRowView (DragDrop-3-)

索引サイト

(参考)http://d.hatena.ne.jp/hilapon/20110209/1297247754
DraggedItem が肝(DependencyProperty 手本)




public static readonly DependencyProperty DraggedItemProperty =
DependencyProperty.Register("DraggedItem", typeof(DataRowView), typeof(Window));
public DataRowView DraggedItem
{
get { return (DataRowView)GetValue(DraggedItemProperty); }
set { SetValue(DraggedItemProperty, value); }
}

UIHelpers.cs は丸ごとコピーして使用




private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
・・・
var row = UIHelpers.TryFindFromPoint((UIElement)sender, e.GetPosition(dataGrid));
・・・
//ドラッグ対象行
DraggedItem = (DataRowView)row.Item;

z_data = DraggedItem[1].ToString();
//**MessageBox.Show(z_data);
}

言葉で言ってしまえばマウスダウンで移動元の行を取得してマウスアップで挿入。
追加してあるのはコピー用のテキスト(名称選択等に使用)




private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
・・・

//移動先の行(SelectedItem)
DataRowView w_RowView = (DataRowView)dataGrid.SelectedItem;

if (w_RowView == null || !ReferenceEquals(DraggedItem, w_RowView))
{
//ドラッグ対象行取り出し
var w_row = DraggedItem.Row.Table.NewRow();
w_row.ItemArray = DraggedItem.Row.ItemArray;
//ドラッグ元の行のインデックス(未使用)
//int tempIndex = z_dataTable.Rows.IndexOf(DraggedItem.Row);

//ドラッグ元の行を削除
z_dataTable.Rows.Remove(DraggedItem.Row);
//ドラッグ先のインデックスに挿入
var w_idx_target = z_dataTable.Rows.IndexOf(w_RowView.Row);
z_dataTable.Rows.InsertAt(w_row, w_idx_target);
//移動行を選択状態
dataGrid.SelectedItem = dataGrid.Items[w_idx_target];
}
ResetDragDrop();
}




//*********************************************************************
/// 移動先
//*********************************************************************
private void OnMouseMove(object sender, MouseEventArgs e)
{
・・・

//***********************************
// 移動先行取得(SelectedItem)
//***********************************
Point position = e.GetPosition(dataGrid);
var row = UIHelpers.TryFindFromPoint(dataGrid, position);
if (row != null)
{
dataGrid.SelectedItem = row.Item;
}
}




AX