xamdatagrid でドラッグ アンド ドロップ機能に取り組んでいます。以下で説明するように、ドラッグ アンド ドロップ機能を実装しました。
1) PreviewMouseLeftButtonDown イベントを作成し、このイベントで DragDrop.DoDragDrop() メソッドを呼び出しています。2) もう 1 つの MouseMove イベントがあり、グリッドから選択した行を取得しています。この選択した行は、ドロップ データを作成するために上記の PreviewMouseLeftButtonDown イベントで使用しています。
私の問題は、同じグリッドにドロップダウン (コンボ ボックス) があることです。DragDrop.DoDragDrop() は同期メソッドであり、PreviewMouseLeftButtonDown から呼び出しているため、ターゲットにドロップするまでマウス イベントを解放せず、ドロップダウンの選択が正しく機能しません。
Boolean フラグも設定してみましたが、ドラッグドロップとコントロールの選択 (ドロップダウン選択) を PreviewMouseLeftButtonDown メソッドと区別できません。グリッド行でドロップダウンを選択せずにドラッグ ドロップを実行している場合にのみ、DragDrop.DoDragDrop() を呼び出す必要があります。操作がドラッグドロップまたはドロップダウン選択であることをどのように識別できますか?
DragDrop.DoDragDrop() の結果を待たずにマウス イベントを有効にする他の方法はありますか。
private void PreviewMouseLeftButtonDown (object sender, MouseButtonEventArgs e)
{
//record presenter I am setting PreviewMouseLeftButtonDown so I am doing the this
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null)
{
itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
var data = new DataObject();
data.SetData(DataFormats.StringFormat, itemName);
DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
}
}
//これは、選択された行を取得するためのものです
private void KeywordMouseMove(object sender, MouseEventArgs e)
{
var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
if (grid != null)
{
//we have editable and not ediable columns.previously we faced issue with noe editable column drag so this added
//Cell area will get for editable and presenter will get for non editable fields.This will get the selected row
var drcellarea = e.Source as DataRecordCellArea;
var drpresenter = e.Source as CellValuePresenter;
DataRecord dataRecord = null;
if (drcellarea != null)
{
dataRecord = drcellarea.DataContext as DataRecord;
}
else if (drpresenter != null)
{
dataRecord = drpresenter.DataContext as DataRecord;
}
if (dataRecord != null)
{
var selectedItem = dataRecord.DataItem as VariableViewModel;
viewmodel.SelectedItem = selectedItem;
}
}
}