WPF绑定DataGridTextColumn的背景颜色为行色
本文关键字:颜色 背景 绑定 DataGridTextColumn WPF | 更新日期: 2023-09-27 18:19:10
假设我有一个包含以下数据的DataGrid:
John, Male
Mary, Female
Tony, Male
Sally, Female
网格被绑定到Person模型对象的ObservableCollection,该对象实现了属性Person的INofifyPropertyChanged。姓名和人物,性别。现在我想将DataGridTextColumn的背景颜色绑定到该人的性别,以便包含男性的行是蓝色的,包含女性的行是粉红色的。是否可以通过向Person模型添加另一个属性来实现这一点,如:
public class Person
{
public Color BackgroundColor
{
get
{
if (gender == "Male")
{
return Color.Blue;
}
else
{
return Color.Pink;
}
}
}
如果是,我如何将其绑定到行或列的背景颜色?我已经有了像这样的有界列:
<DataGridColumn Header="Name" Binding={Binding Name} />
<DataGridColumn Header="Gender" Binding={Binding Gender} />
假设BackgroundColor
是System.Windows.Media.Color
类型,而不是System.Drawing.Color
,如果你想改变整个行的背景,你可以改变DataGrid.RowStyle
并将Background
属性绑定到BackgroundColor
属性
<DataGrid ...>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="{Binding Path=BackgroundColor}"/>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowStyle>
</DataGrid>
你想实现一个IValueConverter来将字符串转换为画笔。参见http://www.wpf-tutorial.com/data-binding/value-conversion-with-ivalueconverter/
public class StringToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (string)value;
return new SolidColorBrush(val == "male" ? Colors.Blue : Colors.Pink);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
在XAML中,您希望<Window.Resources>
像
一样<Window.Resources>
<local:StringToBrushConverter x:Key="stringToBrush" />
<Style x:Key="MaleFemaleStyle" TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding Path=Gender, Converter={StaticResource stringToBrush}}" />
</Style>
</Window.Resources>
然后应用malefemalstyle到你的网格。
<DataGrid CellStyle="{StaticResource MaleFemaleStyle}">
...
</DataGrid>
这对我有用
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding Sex}" Value="Male">
<Setter Property="Background" Value="Blue"/>
</DataTrigger>
<DataTrigger Binding="{Binding Sex}" Value="Female">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>