我正在尝试使用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"));
}
}
运行我的代码后,它正在运行。但是,当我向下滚动鼠标以查看以下行时,它也正在工作。然后,当我向上滚动鼠标以查看第一行时,我的代码不能正常工作。您可以看到打开时间和滚动下面的图片之间的差异。
感谢。
答案 0 :(得分:5)
如果您关闭DataGrid
上的虚拟化:
<DataGrid
EnableRowVirtualization="False"
它正在为不同的行重用DataGridRow
个对象。如果你有10,000行并且可以看到30行,那么创建10,000个DataGridRow
控制对象是愚蠢的。如果你有足够的物品,以上将使你的应用程序瘫痪。但是,您可能会有少量商品,在这种情况下,上面的kludge就足够了。
但在任何情况下你都不需要这样做。正确的方法是启用行虚拟化并使用WPF而不是它,如下面的XAML。
我不知道你的第17列被调用了什么,所以我创建了一个用fizz buzz项填充的quickie表。我的第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>
答案 1 :(得分:0)
可以更容易
AlternationCount = 2
和画笔AlternatingRowBackground
答案 2 :(得分:0)
您也可以尝试
DataGrid.RowStyleSelector
删除虚拟化并不好!