C# 禁用的DataGridRow允许键盘编辑

C# 禁用的DataGridRow允许键盘编辑,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个带有单个列(X)的数据网格。根据窗口中的其他一些复选框,某些行可能是只读的。现在,我发现最简单的方法是获取相关的DataGridRows并设置它们的。IsEnabled=false,然后将它们的背景更改为灰色 这会妨碍鼠标选择单元格以及鼠标双击编辑单元格。此外,使用键盘方向键也不允许进入只读行。但是,如果我编辑最后一个可编辑行中的单元格,请用Enter键结束(此时编辑的单元格显然仍处于选中状态,但不再处于编辑模式),输入更多值,然后再次按Enter键,假定为只读行的值将被更改 下面是我的

我有一个带有单个列(X)的数据网格。根据窗口中的其他一些复选框,某些行可能是只读的。现在,我发现最简单的方法是获取相关的DataGridRows并设置它们的
。IsEnabled=false
,然后将它们的背景更改为灰色

这会妨碍鼠标选择单元格以及鼠标双击编辑单元格。此外,使用键盘方向键也不允许进入只读行。但是,如果我编辑最后一个可编辑行中的单元格,请用Enter键结束(此时编辑的单元格显然仍处于选中状态,但不再处于编辑模式),输入更多值,然后再次按Enter键,假定为只读行的值将被更改

下面是我的意思的“故事书”:

我们有:

  • 用户编辑一个可编辑的单元格(在本例中,从第1行开始)
  • 用户通过按Enter键结束编辑。该单元格不再处于编辑模式,似乎仍处于选中状态
  • 用户键入一个值,但不是编辑明显选中的单元格,而是开始编辑“只读”行中的单元格
  • 通过再次使用Enter,修改“只读”单元格,用户可以自由重复该过程以继续编辑其他此类单元格
  • 我在上面使用了术语“readonly”,但实际上我必须定义
    DataGridRow.IsEnabled=false
    ,这可能是导致此错误的原因。但是,由于DataGridRow不包含
    .IsReadOnly
    属性,因此这是我唯一可以定义的过程

    至于它的价值,这里是相关的代码。您会注意到,DataGrid的绑定完全发生在代码隐藏中,但这是因为绑定的源会根据窗口的其他部分发生变化

    XAML

    <DataGrid Grid.Column="0"
              x:Name="CoordinatesX"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="XColumn" Header="X" Width="50"/>
        </DataGrid.Columns>
    </DataGrid>
    
    此函数用于在选中另一个复选框equalspace时,将必要的行设置为
    。IsEnabled=false

    void CheckConstraints()
    {
        var cable = DataContext as NCable;
        int nPoints = cable.Points.Count;
        if (EqualSpacing.IsChecked == true)
        {
            DataGridRow r;
            for (int i = 1; i < nPoints - 1; i++)
            {
                r = CoordinatesX.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
                if (r == null)
                    break;
                r.Background = Brushes.LightGray;
                r.IsEnabled = false;
            }
            r = CoordinatesX.ItemContainerGenerator.ContainerFromIndex(nPoints - 1) as DataGridRow;
            if (r == null)
                return;
            r.Background = ((nPoints - 1) % 2 == 0 ? Brushes.White : Brushes.AliceBlue);
            r.IsEnabled = true;
        }
    }
    
    void CheckConstraints()
    {
    var电缆=作为NCable的DataContext;
    int nPoints=cable.Points.Count;
    if(equalspace.IsChecked==true)
    {
    数据网格r;
    对于(int i=1;i
    有什么解决办法吗?我做错什么了吗

    void CheckConstraints()
    {
        var cable = DataContext as NCable;
        int nPoints = cable.Points.Count;
        if (EqualSpacing.IsChecked == true)
        {
            DataGridRow r;
            for (int i = 1; i < nPoints - 1; i++)
            {
                r = CoordinatesX.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
                if (r == null)
                    break;
                r.Background = Brushes.LightGray;
                r.IsEnabled = false;
            }
            r = CoordinatesX.ItemContainerGenerator.ContainerFromIndex(nPoints - 1) as DataGridRow;
            if (r == null)
                return;
            r.Background = ((nPoints - 1) % 2 == 0 ? Brushes.White : Brushes.AliceBlue);
            r.IsEnabled = true;
        }
    }