WPF DataGrid
的默认行为是选择何时单击一行SelectionMode="Extended"
这是我想要的,但是我也希望该行取消选择,如果它之前已经单击时选择。
我尝试过以下操作,一旦选中该行就会取消选择,似乎行选择发生在鼠标点击事件之前。
private void DoGridMouseLeftButtonUp(object sender, MouseButtonEventArgs args) {
// Get source row.
DependencyObject source = (DependencyObject)args.OriginalSource;
var row = source.FindParent<DataGridRow>();
if (row == null)
return;
// If selected, unselect.
if (row.IsSelected) {
row.IsSelected = false;
args.Handled = true;
}
}
我使用以下网格绑定此事件。
<DataGrid SelectionMode="Extended"
SelectionUnit="FullRow"
MouseLeftButtonUp="DoGridMouseLeftButtonUp">
答案 0 :(得分:3)
我已经成功解决了这个问题,而不是处理网格本身上的事件来处理它们,而是涉及DataGridCell
的事件设置器,如下所示:
<DataGrid SelectionMode="Extended"
SelectionUnit="FullRow">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="PreviewMouseLeftButtonDown"
Handler="DoCheckRow"/>
</Style>
</DataGrid.Resources>
<!-- Column mapping omitted. -->
</DataGrid>
事件处理程序代码。
public void DoCheckRow(object sender, MouseButtonEventArgs e) {
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing) {
DataGridRow row = FindVisualParent<DataGridRow>(cell);
if (row != null) {
row.IsSelected = !row.IsSelected;
e.Handled = true;
}
}
}
我的网格是只读的,因此这里忽略任何编辑行为。
答案 1 :(得分:0)
我的wpf数据网格需要CTRL + CLICK来添加和删除MULTIPLE行。所以它的标准行为;)但是,为什么你不使用PreviewMouseDown事件,然后检查leftmousebutton和Ctrl并执行取消选择逻辑并设置e.handled = true?