我正在制作一个WPF程序,它能够使用DataGrid
循环逐个为for
中的行着色并且我遇到了一些奇怪的东西。如果DataGrid
从数据库表中有超过40行数据,则它不会为所有行着色。
这是我正在使用的代码。
private void Red_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < dataGrid1.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(i);
if (row != null)
{
row.Background = Brushes.Red;
}
}
}
有没有其他方法可以通过其他方法逐行对行进行着色,或者这是wpftoolkit中的某种错误?
答案 0 :(得分:4)
如果要为每一行定义颜色,并且在行显示的项目上有属性,则可以使用ItemsContainerStyle设置行颜色。在下面的示例中,您将在网格中的项目上有一个名为ItemColour的属性,该属性将定义背景行颜色。绑定从行绑定到行包含的项目。
<dg:DataGrid.ItemContainerStyle>
<Style
TargetType="{x:Type dg:DataGridRow}"
BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
<Setter
Property="Background"
Value="{Binding ItemColour}" />
</Style>
</dg:DataGrid.ItemContainerStyle>
但您可能不希望商品属性ItemColour,因为它们可能是您的商业模式。这是ViewModel自成一体的地方。您定义了一个中间层,它根据某些自定义逻辑包装您的业务层和ItemColour属性。
答案 1 :(得分:2)
如果要为网格的所有行设置背景,可以定义新的行样式对象并设置其Background属性;这应该一次性更改所有行背景,而无需迭代它们。像这样的Smth:
dataGrid1.RowStyle = new Style(typeof(DataGridRow));
dataGrid1.RowStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Red)));
您还可能需要根据数据对象后面的数据对象的状态更改数据网格行的背景。在这种情况下,您可以在xaml中设置带触发器的自定义样式,并为其指定rowstyle。我想这就像这样:
<Window.Resources>
<Style x:Key="customDataGridRowStyle" TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding Test1}" Value="1">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
..
<DataGrid .. DataGrid.RowStyle ="{StaticResource customDataGridRowStyle}" >
..
在上面的示例中,只要“Test1”属性的值为“1”,红色背景就会设置为该行
希望这有帮助,尊重
答案 2 :(得分:0)
屏幕上看不到的行将无法使用此方法进行着色,因为它们已被虚拟化并且实际上并不存在。在下面的样式中我绑定到一个属性IsRed来转换红色和它们的默认颜色之间的行(把它放在from的资源与数据网格上)
<Style
TargetType="{x:Type dg:DataGridRow}"
BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
<Style.Triggers>
<DataTrigger
Binding="{Binding ElementName=self, Path=IsRed}"
Value="True">
<Setter
Property="Background"
Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
我的表单上有一个名为IsRed的依赖项属性,它也可以是实现INotifyPropertyChanged的任何属性(依赖项属性通知它们的更改)
public Boolean IsRed {
get { return (Boolean)GetValue(IsRedProperty); }
set { SetValue(IsRedProperty, value); }
}
// Using a DependencyProperty as the backing store for IsRed. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsRedProperty =
DependencyProperty.Register("IsRed", typeof(Boolean), typeof(Window1), new UIPropertyMetadata(false));
然后在我的xaml中,我在顶部有声明
<Window
x:Class="Grids.Window1"
x:Name="self">
这意味着我可以使用元素名称绑定(我觉得有用的技术)引用它
使用代码如我所概述的所有按钮点击将不得不
private void Button_Click(object sender, RoutedEventArgs e) {
IsRed = !IsRed;
}