当SelectionMode =“Extended”时,如何在点击时取消选择DataGrid?

时间:2011-06-24 08:23:46

标签: wpf datagrid wpf-controls

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">

2 个答案:

答案 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?