c# - 更改 DataGridCell 与其内容相关的背景

标签 c# wpf datagrid background datagridcell

我知道我的问题已经在这里以多种方式陈述和回答。但我就是无法让它按照我想要的方式运行。 如标题所述,我尝试根据其内容更改 datagridcell 的背景颜色。 我对 WPF 比较陌生,但我想解决方案是将转换器与绑定(bind)相结合。 目标是根据称为“状态”的属性更改单元格的背景颜色,该属性是具有四种状态的枚举。

我已经写了一个转换器:

using System;
using System.Windows.Data;
using System.Drawing;
using System.Windows;

namespace Admin
{
    [ValueConversion(typeof(Member.UserStatus), typeof(Brushes))]
    public class StatusToColorConverter : IValueConverter
    {
        #region IValueConverter Member

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var enumValue = (Member.UserStatus)value;

            if(enumValue == Member.UserStatus.Change)
                return Brushes.Red;
            if(enumValue == Member.UserStatus.Import)
                return Brushes.Blue;
            if(enumValue == Member.UserStatus.Remove)
                return Brushes.Orange;
            if(enumValue == Member.UserStatus.Synced)
                return Brushes.Green;
            else
                return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

到目前为止一切顺利。 xaml 部分看起来像这样(经过一些谷歌搜索...)

<DataGrid.Columns>              
    <DataGridTemplateColumn Header="Status">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Status}" Background="{Binding Status, Converter={StaticResource StatusToColorConverter}}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns> 

我(还)不太明白 DataGridTemplateColums 和 DataTemplates 是什么。但是我用 CellStyle 和另一种我不记得的方式尝试了同样的方法。 转换器有一个断点,在我尝试过的所有解决方案中都会被调用。但不知何故,“背景”属性似乎忽略了转换器的返回值。所以我想我的错误(或我的不理解)还有其他来源。

有人愿意为我指出正确的方向吗?

最佳答案

如果我正确解释了您的 XAML - 您绘制的是列 HEADER(“最顶层”单元格),而不是单元格本身。

这对我有用:

<DataGrid.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="{Binding Status},
                       Converter={StaticResource StatusToColorConverter}">
                    </Setter>
                </Style>
</DataGrid.CellStyle>

这应该绘制你的单元格

作为旁注:如果您正在绘制它们的背景,您的单元格可能看起来“很奇怪”——我的单元格经常丢失它们的边框等。一个快速简单的解决方法是添加以下 Propertie Setters(这是默认的 wpf 样式)

 <Setter Property="BorderThickness" Value="1,0,1,1"></Setter>
 <Setter Property="BorderBrush" Value="#FF000000"></Setter>

关于c# - 更改 DataGridCell 与其内容相关的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17670798/

相关文章:

c# - 无法在同一 block 中启用已禁用的控件

c# - Microsoft.Expression.Controls 标注指向控件的 anchor

c# - 加快 WPF 调整大小/重绘

c# - 如何在 wpf datagrid 中获取所选单元格的行标题值?

c# - 在 LINQ 中加入匿名类型

c# - aspx 页面作为页面的参数

c# - 在哪里复制 gsdll32.dll 以使 PDF 到图像转换器在我的 WPF 应用程序中工作?

iPhone - 表格/网格数据

wpf - 如何更改 DataGridComboBoxColumn 中单元格值的前景色?

c# - 如何在三个类中处理事件