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} />

WPF绑定DataGridTextColumn的背景颜色为行色

假设BackgroundColorSystem.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>