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