1

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

我已经写了一个转换器:

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 和另一种我不记得的方式尝试了同样的方法。转换器有一个断点,并在我尝试的所有解决方案中被调用。但不知何故,“背景”属性似乎忽略了转换器的返回值。所以我猜我的错(或我缺乏理解)有另一个来源。

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

4

3 回答 3

3

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

这对我有用:

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

这应该画你的细胞

作为旁注:如果您正在绘制背景,您的单元格可能看起来“奇怪” - 我的单元格经常失去它们的边框等。快速简便的解决方法是添加以下属性设置器(这是默认的 wpf 样式)

 <Setter Property="BorderThickness" Value="1,0,1,1"></Setter>
 <Setter Property="BorderBrush" Value="#FF000000"></Setter>
于 2013-07-16T08:21:13.920 回答
1

好了朋友们。我现在已经解决了这个问题。问题不是我的 xaml 代码。转换器也工作得很好。问题是转换器 .cs 文件中的以下行:

    using System.Drawing;

我用正确的替换它:

    using System.Windows.Media;

现在它就像一个魅力。...我传递的是 WinForms 的画笔而不是 WPF 画笔!

无论如何感谢所有的帮助:)

于 2013-07-16T10:00:04.483 回答
1

我是这样做的:

              <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="Background">
                            <Setter.Value>
                                <Binding Path="Row" Mode="OneWay" />
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>

请注意,我使用 DataView 作为 DataGrid 的 ItemsSource,因此我绑定到“Row”。项目基本上是 DataRowView。然后您需要访问转换器中的行值:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        var enumValue = (Member.UserStatus)((DataRow)value)["Status"];
        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;
    }
于 2013-07-16T08:10:18.790 回答