C# 更改不可见的DataGrid行的背景色

C# 更改不可见的DataGrid行的背景色,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个带有交替行背景(白色和蓝色)的数据网格。但是,某些选项可以使某些行为只读(例如,行的后半部分),在这种情况下,背景将更改为浅灰色。数据网格是动态填充的,因此所有这些后台更改都是在代码隐藏中完成的 例如,如果数据网格的前半行必须是可编辑的,后半行必须是只读的,则代码是 if (Symmetric.IsChecked == true) { int n = (nPoints % 2 == 0 ? nPoints / 2 : (nPoints + 1) / 2); for (in

我有一个带有交替行背景(白色和蓝色)的数据网格。但是,某些选项可以使某些行为只读(例如,行的后半部分),在这种情况下,背景将更改为浅灰色。数据网格是动态填充的,因此所有这些后台更改都是在代码隐藏中完成的

例如,如果数据网格的前半行必须是可编辑的,后半行必须是只读的,则代码是

if (Symmetric.IsChecked == true)
{
    int n = (nPoints % 2 == 0 ? nPoints / 2 : (nPoints + 1) / 2);
    for (int i = 1; i < n; i++)
    {
        //resultSections is the DataContext of the (DataGrid)SectionsGrid
        resultSections[i].IsReadOnly = false;
        var r = SectionsGrid.GetRow(i);
        if (r == null)
            continue;
        r.Background = (i % 2 == 0 ? Brushes.White : Brushes.AliceBlue);
    }
    for (int i = n; i < nPoints; i++)
    {
        resultSections[i].X = ProjectProperties.I.BeamLength - resultSections[nPoints - i - 1].X;
        resultSections[i].IsReadOnly = true;
        var r = SectionsGrid.GetRow(i);
        if (r == null)
            continue;
        r.Background = Brushes.LightGray;
    }
}
这在设置
.IsReadOnly
将背景灯变为灰色时起作用,但在超出“滚动范围”的行上仍会失败。一旦我滚动,它们就不会变成灰色

默认情况下,dataGrid的虚拟化处于启用状态,这意味着dataGridRow仅为可见行生成。其他行仅在滚动后进入视口时生成

如果希望一次获取所有行,可以通过设置
virtualizangstackpanel.isvirtualization=“False”
关闭dataGrid上的虚拟化

<Style x:Key="ReadOnlyCheck" TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsReadOnly}" Value="True">
            <Setter Property="Tag" Value="ReadOnly" />
            <Setter Property="Background" Value="LightGray"/>
        </DataTrigger>
    </Style.Triggers>
<DataGrid VirtualizingStackPanel.IsVirtualizing="False"/>
<DataGrid>
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <EventSetter Event="Loaded" Handler="Row_Loaded"/>
        </Style>
    </DataGrid.ItemContainerStyle>
</DataGrid>
private void Row_Loaded(object sender, RoutedEventArgs e)
{
    (sender as DataGridRow).Background = Brushes.AliceBlue;
}