WPF将DataGridTextColumn的背景颜色绑定为逐行着色

Posted

技术标签:

【中文标题】WPF将DataGridTextColumn的背景颜色绑定为逐行着色【英文标题】:WPF bind background color of DataGridTextColumn to color by row 【发布时间】:2016-01-23 09:34:50 【问题描述】:

假设我有一个包含以下数据的 DataGrid:

John, Male
Mary, Female
Tony, Male
Sally, Female

网格绑定到 Person 模型对象的 ObservableCollection,该对象为属性 Person.Name 和 Person.Gender 实现 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 />

【问题讨论】:

DataGridTextColumn 还是整行? 我想要整行。 【参考方案1】:

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

【讨论】:

试过了,效果很好!但我注意到它不适用于前色。理想情况下,我希望对两者都有绑定。知道为什么吗? @user3685285 我刚刚尝试过,它也适用于Foreground。只需复制背景Setter,但使其设置Foreground 属性并以完全相同的方式绑定Color,只是到视图模型中的不同颜色属性(例如ForegroundColor)。 嗯,好的。一定是因为我使用的是现代 UI 扩展,所以我必须以某种方式覆盖默认样式。谢谢。【参考方案2】:

您想实现一个 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 中,您需要 &lt;Window.Resources&gt; 喜欢

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

然后将 MaleFemaleStyle 应用到您的网格。

<DataGrid CellStyle="StaticResource MaleFemaleStyle">
    ...
</DataGrid>

【讨论】:

你确定这行得通吗?如何将此应用于两列,xaml 如何知道我正在尝试设置背景颜色? 对不起,我在审阅之前提交了。更新应该做正确的事情。最主要的是使用IValueConverter - 这是 MVVM 的最佳实践。剩下的就是实现细节了。 +1 读得很好,但我认为在这种情况下这对我来说过于复杂了。我会记住它以供其他用途。 我不怪你。 WPF 有时给人一种“笨手笨脚”的感觉。不过,如果这些对您很重要,那么它对可测试性和模块化会更好。【参考方案3】:

这对我有用

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

【讨论】:

以上是关于WPF将DataGridTextColumn的背景颜色绑定为逐行着色的主要内容,如果未能解决你的问题,请参考以下文章

将 WPF 从 .NET 4 更新到 4.5.2,DataGridTextColumn Visibility DataContext 引用损坏

如何在 WPF 中将 DatePicker 添加到 DataGridTextColumn

WPF C# 数据绑定到 DataGridTextColumn

WPF中datagrid的DataGridTextColumn显示多行

WPF 给DataGridTextColumn统一加上ToolTip

wpf: DataGridTextColumn 数字格式显示,编辑时取消格式(StringFormat)