WPF程序化根据条件更改行背景颜色

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

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

第一个订单很好 为什么让人困惑

谢谢。


什么是renk,即行应该被着色的确切条件是什么? - undefined
3个回答

7

如果您关闭DataGrid的虚拟化,这应该可以正常工作:

<DataGrid
    EnableRowVirtualization="False"

它是对不同行重用DataGridRow对象。如果您有10,000行数据,其中只有30行可见,创建10,000个DataGridRow控件对象是愚蠢的。如果您有足够的项目,以上方法会使您的应用程序崩溃。然而,您可能只有少量项目,那么以上的折衷方案就足够好了。

但无论如何,您都不需要这样做。正确的方法是保留行虚拟化并与WPF一起使用,而不是反其道而行之,像下面的XAML代码一样。

我不知道您的第17列叫什么,所以我创建了一个快速填充fizz buzz项的表格。我相当于您的第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
它已经工作了。我还会尝试使用DataGrid.RowStyleSelector,就像@GCamel的回答一样。 非常感谢。 - undefined
@enderaric 我不会在这里使用 RowStyleSelector。对于这种情况来说,它过于繁重了。虽然可以用它来解决这个问题,但需要编写比编写一个带有一些触发器的单个样式更多的代码。 - undefined
1
非常感谢您的帮助。我按照您的示例在XAML中编写了触发器,并在我的绑定类中添加了一个属性,然后根据需要设置了该属性。效果非常好。我特别感谢您首先展示了简单便宜的EnableRowVirtualization方法,然后再介绍更好的解决方案。如果我能给您超过1分的评分,我一定会这样做的。 - undefined

0
使用XAML作为DataGrid的属性可以更加简单。
AlternationCount = 2
还有AlternatingRowBackground这个画刷。

AlternationCount可以改变,它会根据不同的参数而改变。我知道AlternationCount,但是我必须通过控制第17列的值来控制datagrid。 - undefined
好的,你在哪里初始化了 renk++?因为如果网格是虚拟化的,那么你将永远不会从相同的位置开始。 - undefined
你试过在AlternatingRowBackground上放置一个转换器,根据第17个值转换为颜色刷吗? - undefined
在loadingrow函数之外,我希望只在填充数据表后运行loadingrow事件。我不想在滚动条上运行该事件。这是我的问题。 - undefined
这是由虚拟化引起的;我确定当你向上滚动或者??时,你的事件被触发了。 - undefined

0

你也可以尝试一下

DataGrid.RowStyleSelector

移除虚拟化不是一个好的选择!


我会尝试。然后我会写下结果。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接