次の方法でDataGridの選択動作を変更したいと思います。通常、複数の行が選択されていて、すでに選択されている項目の1つをクリックすると、その選択はクリックされた項目のみにリセットされます。複数選択された行のいずれかがキーボード修飾子なしでクリックされた場合、その選択は変更されないように変更したいと思います。これの目的は、複数項目のドラッグアンドドロップを許可することです。DataGridの選択動作をどのようにオーバーライドできますか?
:私はDataGridCell.OnMouseLeftButtonDown、このような何かをオーバーライドすることで動作を変更することができるはずのよう がat System.Windows.Controls.DataGrid.OnSelectionChanged(SelectionChangedEventArgs e)
at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
at System.Windows.Controls.DataGrid.MakeFullRowSelection(ItemInfo info, Boolean allowsExtendSelect, Boolean allowsMinimalSelect)
at System.Windows.Controls.DataGrid.HandleSelectionForCellInput(DataGridCell cell, Boolean startDragging, Boolean allowsExtendSelect, Boolean allowsMinimalSelect)
at System.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown(MouseButtonEventArgs e)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
ので、それが見えます:私は、前述のデフォルトの動作が起動されると、コールスタックが含まれていることに気づい
class MultiDragDataGridCell : DataGridCell
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
// This allows users to click-and-drag a multi-selection by handling the event before
// the default behavior (deselecting everything but the clicked cell) kicks in.
if (IsSelected && Keyboard.Modifiers == ModifierKeys.None)
{
e.Handled = true;
}
base.OnMouseLeftButtonDown(e);
}
}
しかし、DataGridCellをインスタンス化するクラスが内部であるため、通常のDataGridCellの代わりにDataGridにMultiDragDataGridCellを作成するのに問題があります。誰もが私がそれを達成する方法を知っている、または私が望む行動を達成する別の方法があるかどうか?
他のものは、私が試した:
- のMouseLeftButtonDownにハンドラを追加するDataGridCellをスタイリング。選択が既に変更された後に実行されるため、これは機能しません。
- DataGridCellのスタイルを設定して、PreviewMouseLeftButtonDownにハンドラを追加します。これは動作しますが、セル内のボタンなどをクリックすることができなくなります。
を、私はこのアウトを試してみましたが、それは動作しますが、何らかの理由でそれがセル選択の表示を台無しに。表示はまだ古い動作に従っているようですが、実際のSelectedItemsはあなたが期待するものです。 – hypehuman