5

我想在 WPF 数据网格中操作选择,但是在访问实际单元格并将焦点设置在它们上并将它们标记为选中时遇到问题。

  1. 谁能解释一下:为什么没有一些简单的方法可以从 **DatagridCellInfo** 获取 **DatagridCell**?
  2. 为什么几乎没有人使用 WPF 数据网格?(我没有看到太多的 Q/A 投票)
  3. 有没有一种简单的方法可以为 WPF 数据网格创建自己的选择模式?

我有什么问题

在不按 Ctrl 的情况下选择更多单元格(一个接一个)时,我想在 WPF Datagrid 上进行自定义选择。我做得很好,但是当我想取消选择一个选定的单元格时遇到问题 - 只需单击它即可。从列表中删除它不是问题。问题是,当它被点击时,它会获得焦点并被高亮,而所有其他被选中的人都会关闭它们的高亮。如果我选择另一个未选择的单元格,则所有选定的单元格都会再次正确突出显示。问题仅在于取消选择。

我的代码:

XAML:

<Window x:Class="SelectionTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="DataGridCell">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
                                
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Pink"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid 
            Name="mydatagrid"
            Width="Auto" Height="Auto"
            HeadersVisibility="All"
            AutoGenerateColumns="True" IsReadOnly="True"
            SelectionMode="Extended" SelectionUnit="Cell" 
            CanUserAddRows="False" CanUserDeleteRows="False"
            CanUserResizeColumns="False" CanUserResizeRows="False" 
            CanUserReorderColumns="False" CanUserSortColumns="False"
            SelectedCellsChanged="mydatagrid_SelectedCellsChanged"
            Padding="10" HorizontalAlignment="Center" VerticalAlignment="Top"
            >            
        </DataGrid>  
    </Grid>
</Window>

我已经用我制作的一些随机示例类对象的列表填充了数据网格。

C#:

        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            
            DataGridCellInfo cellInfo = new DataGridCellInfo(cell);

            if ((cell.IsSelected)||(selectedList.Contains(cellInfo))||(selectedCellsList.Contains(cell)))
            {
                selectedList.Remove(cellInfo);
                selectedCellsList.Remove(cell);
                cell.IsSelected = false;
                mydatagrid.CurrentCell = selectedList[0];
            }
            else
            {

               if (selectedList.Count < 7)
               {
                   selectedList.Add(cellInfo);
                   selectedCellsList.Add(cell);
               }
               else
               {
                  selectedList.RemoveAt(0);
                  selectedList.Add(cellInfo);
                  selectedCellsList.RemoveAt(0);
                  selectedCellsList.Add(cell);
               }
            }
            
            mydatagrid.SelectedCells.Clear();
            mydatagrid.UnselectAll();

            foreach (DataGridCell xcell in selectedCellsList)
            {
                xcell.IsSelected = true;
                xcell.Focus();
            }
}

如果这段代码对你来说真的很难看,那么我很抱歉。但我仍然只是一个小小的 csharpawan。

快捷方式中我的问题是什么:单击选定的单元格只会使其突出显示和聚焦,并取消所有其他选定的单元格,这与我想要它做的完全相反。(如果我单击其他尚未选择的单元格,它会按照我想要的方式工作。)

4

1 回答 1

41

对问题 1 的回答:从 DataGridCellInfo 获取 DataGridCell 的快速方法:

    public DataGridCell GetDataGridCell(DataGridCellInfo cellInfo)
    {
        var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
        if (cellContent != null)
            return (DataGridCell) cellContent.Parent;

        return null;
    }
于 2013-06-12T13:22:37.163 回答