我想通過以下方式修改DataGrid的選擇行爲。通常情況下,當您選擇多行時,然後單擊已選中的某個項目,選擇將重置爲僅點擊項目。我想對其進行更改,以便在沒有任何鍵盤修改器的情況下單擊其中一個多選行時,選擇內容不會被修改。這樣做的目標是允許多項目拖放。如何覆蓋DataGrid選擇行爲?
我注意到,當上述默認行爲被激活時,調用堆棧包括:
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)
因此它看起來像我應該能夠通過重寫DataGridCell.OnMouseLeftButtonDown,像這樣修改的行爲:
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);
}
}
但是,我無法讓DataGrid創建MultiDragDataGridCell而不是普通的DataGridCell,因爲實例化DataGridCell的類是內部的。任何人都知道我可以如何實現這一點,或者如果有另一種實現我想要的行爲的方式?
其他的事情我想:
- 樣式化DataGridCell的處理程序添加到的MouseLeftButtonDown。這不起作用,因爲它在選擇已經改變之後執行。
- 設計DataGridCell以向PreviewMouseLeftButtonDown添加處理程序。這有效,但它阻止我點擊單元格內的任何按鈕等。
我嘗試了這一點,它的工作原理,但由於某些原因,它打亂了小區選擇的顯示。顯示器似乎仍然遵循舊的行爲,但實際SelectedItems是你所期望的。 – hypehuman