如何在WPF DataGrid中使用SelectionUnit = Cell取消选择单元格

时间:2018-06-28 07:49:57

标签: c# wpf datagrid

我正在WPF应用程序上使用VS2015。 在我的WPF窗口之一上,我得到了一个SelectionGrid = Cell和SelectionMode = Single的DataGrid。 此外,我有一种方法可以上下移动DataGrid中的行进行排序。 排序有效,但问题在于,始终在视觉上选择了鼠标光标选择的最后一个单元格(蓝色背景),这可能会打扰用户。 因此,我尝试通过以下代码行删除该单元格的视觉标记:

datagrid.UnselectAllCells();
datagrid.SelectedCells.Clear();

这两行都不适合我。 最后选择的单元格仍处于选中状态。

如何删除该选择?

任何帮助将不胜感激。

最后是来自XAML的带有DataGrid定义的代码段:

<DataGrid x:Name="grdGraphicalElementMatrix" Grid.Row="1" Grid.Column="0"
          HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
          CanUserAddRows="True" 
          IsReadOnly="False"
          AutoGenerateColumns="False"
          SelectionUnit="Cell" SelectionMode="Single"
          CurrentCellChanged="grdGraphicalElementMatrix_CurrentCellChanged"
          ItemsSource="{Binding GraphElemMatrix}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="colXAssignment"
                            Width="1*"
                            Binding="{Binding Path=X}"
                            Header="X"/>
        <DataGridTextColumn x:Name="colYAssignment"
                            Width="1*"
                            Binding="{Binding Path=Y}"
                            Header="Y"/>
    </DataGrid.Columns>
</DataGrid>

grdGraphicalElementMatrix_CurrentCellChanged是一种方法,当用户单击其中一个单元格以选择它时,我可以获取选定的行和列。

    private void grdGraphicalElementMatrix_CurrentCellChanged(object sender, EventArgs e)
    {
        if (grdGraphicalElementMatrix.CurrentCell != null && grdGraphicalElementMatrix.CurrentCell.Column != null)
        {
            vm.GrdGraphicalElementMatrixSelColIndex = grdGraphicalElementMatrix.CurrentCell.Column.DisplayIndex;
            vm.GrdGraphicalElementMatrixSelRowIndex = grdGraphicalElementMatrix.Items.IndexOf(grdGraphicalElementMatrix.CurrentItem);
        }
    }

2 个答案:

答案 0 :(得分:1)

我已经设置了一个测试应用程序,该应用程序可以清除DataGrid选择-带有以下内容:

查看

<DockPanel>
    <Button Content="Clear Selected" DockPanel.Dock="Bottom" Command="{Binding ClearGridCommand}" CommandParameter="{Binding ElementName=datagrid}"/>
    <DataGrid x:Name="datagrid" 
            CurrentCell="{Binding SelectedCell, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
            SelectionMode="Single" 
            SelectionUnit="Cell" 
            HorizontalAlignment="Stretch" 
            Margin="10" 
            VerticalAlignment="Stretch" 
            ItemsSource="{Binding Customers}" 
            CanUserAddRows="True" 
            IsReadOnly="False"
            AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name"></DataGridTextColumn>
            <DataGridTextColumn Header="No"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</DockPanel>

请注意,我正在通过CommandParameter将Datagrid传递给Button命令

DataContext

private object selectedCell = null;

public object SelectedCell {
    get { return this.selectedCell; }
    set {
        if (this.selectedCell != value) {
            this.selectedCell = value;
            SetPropertyChanged("SelectedCell");
        }
    }
}

public void ClearGrid(object obj) {
    var dg = obj as DataGrid;
    if (dg != null) {
        dg.UnselectAllCells();
    }
}

也许可以通过调试SelectedCell中的setter来获取更多信息。也许正在清除,但是可以通过您的grdGraphicalElementMatrix_CurrentCellChanged方法重新选择?

答案 1 :(得分:0)

非常感谢您的帮助和有用的提示。 感谢您,我找到了一个可行的解决方案。

首先,我已将CurrentCellChanged事件替换为SelectedCellsChanged事件。 然后我重新编程了用于向上或向下移动所选行的方法。 这是用于取消选择旧行索引处的单元格并选择新行索引处的单元格的新代码。

// UnselectAllCells was correct.
datagrid.UnselectAllCells();
// But a refresh is needed. This was missing.
datagrid.Items.Refresh();
// Selects the cell in the moved row. Focus is needed, so the cell appears selected all the time.
datagrid.CurrentCell = new DataGridCellInfo(datagrid.Items[newIndex], datagrid.Columns[GrdGraphicalElementMatrixSelColIndex]);
datagrid.SelectedCells.Add(datagrid.CurrentCell);
datagrid.Focus();