WPF以编程方式更改行背景颜色的条件

时间:2017-03-20 14:43:58

标签: c# wpf colors row

我正在尝试使用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"));
        }
    }

运行我的代码后,它正在运行。但是,当我向下滚动鼠标以查看以下行时,它也正在工作。然后,当我向上滚动鼠标以查看第一行时,我的代码不能正常工作。您可以看到打开时间和滚动下面的图片之间的差异。

First order is good Why it is confusing

感谢。

3 个答案:

答案 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)

使用xaml作为Datagrid作为

的属性,

可以更容易

AlternationCount = 2

和画笔AlternatingRowBackground

答案 2 :(得分:0)

您也可以尝试

DataGrid.RowStyleSelector

删除虚拟化并不好!