我正在尝试使用LoadingRow以编程方式更改行颜色。它按我的需要工作。但是问题出在滚动条上。当我在datagrid中使用滚动条时,我的公式再次运行,并且我得到了愚蠢的有序行颜色。
这是我的代码。我试图用第17列的值更改颜色。
private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
{
DataGridRow row = e.Row;
DataRowView rView = row.Item as DataRowView;
if (rView != null && rView.Row.ItemArray[17].ToString().Contains("1"))
{
renk++;
}
if (renk % 2 == 0)
{
e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FF0000"));
}
else
{
e.Row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#ffffff"));
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码运行后,它正在工作。但是,当我向下滚动鼠标以查看以下行时,它也正在工作。然后,当我向上滚动鼠标以查看第一行时,我的代码无法正常工作。您可以在下面看到打开时间和滚动图片之间的时差。
谢谢。
如果您在以下位置关闭了虚拟化功能,则该方法应该有效DataGrid:
<DataGrid
EnableRowVirtualization="False"
Run Code Online (Sandbox Code Playgroud)
它正在将DataGridRow对象重新用于不同的行。如果您有10,000行并且可见30行,那么创建10,000个DataGridRow控件对象是很愚蠢的。如果您有足够的物品,以上内容将使您的申请屈膝。但是,您的物品数量可能很少,在这种情况下,上述混合效果就足够了。
但是无论如何您都不需要这样做。正确的方法是使行虚拟化保持启用状态,并使用WPF而不是与之相反,如下面的XAML所示。
我不知道您的第17列叫什么,所以我创建了一个快速表,其中填充了嘶嘶声。我相当于您的第17列是名为的列State。如果您提供更多信息,我们可以使此匹配您的实际工作。
<DataGrid
ItemsSource="{Binding FizzBuzzTable}"
>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="Fizz">
<Setter Property="Background" Value="LightYellow" />
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="Buzz">
<Setter Property="Background" Value="LightSkyBlue" />
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="FizzBuzz">
<Setter Property="Background" Value="GreenYellow" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)