Wpf 当SelectionMode=";时,如何让DataGrid在单击时取消选择;“扩展”吗;?

Wpf 当SelectionMode=";时,如何让DataGrid在单击时取消选择;“扩展”吗;?,wpf,datagrid,wpf-controls,Wpf,Datagrid,Wpf Controls,WPFDataGrid的默认行为是,如果SelectionMode=“Extended”是我想要的,则在单击某行时选择该行,但是如果该行以前在单击时已被选中,则我也希望该行取消选择 我已经尝试了下面的方法,它将在选中行后立即取消选中该行,看起来行选择发生在鼠标单击事件之前 private void DoGridMouseLeftButtonUp(object sender, MouseButtonEventArgs args) { // Get source row. Depen

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;
    }
}
private void DoGridMouseLeftButtonUp(对象发送方,MouseButtonEventArgs参数){
//获取源行。
DependencyObject源=(DependencyObject)args.OriginalSource;
var row=source.FindParent();
if(行==null)
返回;
//如果选择,则取消选择。
如果(选择第行){
row.IsSelected=false;
args.Handled=true;
}
}
我将使用以下网格绑定到此事件

<DataGrid SelectionMode="Extended"
          SelectionUnit="FullRow"
          MouseLeftButtonUp="DoGridMouseLeftButtonUp">


我的wpf数据网格需要按住CTRL键并单击以添加和删除多行。所以它的标准行为;)但是,为什么不使用PreviewMouseDown事件,然后检查leftmousebutton和Ctrl,执行取消选择逻辑并设置e.handled=true?

我已经设法解决了这个问题,而不是在网格上处理事件,而是在单元格上处理它们,这涉及到
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;
        }
    }
}
public-void-DoCheckRow(对象发送器,鼠标按钮){
DataGridCell=发送方为DataGridCell;
if(cell!=null&!cell.IsEditing){
DataGridRow行=FindVisualParent(单元格);
如果(行!=null){
row.IsSelected=!row.IsSelected;
e、 已处理=正确;
}
}
}

“我的网格”是只读的,因此此处将忽略任何编辑行为。

是否应由用户取消选择上一选定行?用户只需单击“Ctrl”+“leftMousebutton”即可完成此操作?我错过了datagrid标记,对此深表歉意。@blindmeis-通常情况下,这会很好,但是WPF
datagrid
在其行为上不是标准的,控件通常需要Ctrl+click来添加和删除,
DataGrid
仅需要CTRL键进行减法运算。我们的目标受众是简单的人,他们会发现只需单击一行进行选择/取消选择就简单得多。奇怪的是,我不需要按CTRL键进行添加(.NET 4)。今晚我将检查预览事件,谢谢。奇怪的是,use.net4也是如此。例如,如果我想选择第三行,我需要使用CTRL。在
PreviewMouseLeftButtonUp
上单击“取消”会导致与非预览事件相同的行为,即在选择后立即取消选择。不过我确实有一个解决方案。这是可行的,但是当我向CellTemplate添加一个按钮时,它的事件不会被触发,因为我们正在设置e.Handled=true。有没有办法解决这个问题?我能解决我的问题。这里的问题/答案很好,我想提一点类似的东西,不过我手边没有一台windows电脑可以先测试,很高兴听到它对你有用。