我知道我的问题已在此处以多种方式陈述和回答。但我无法让它以我想要的方式运行。 正如标题所述,我尝试根据其内容更改datagridcell的背景颜色。 我对WPF比较新,但我想解决方案是结合了绑定的转换器。 目标是根据名为“Status”的属性更改单元格的背景颜色,该属性是具有四种状态的枚举。
我已经写了一个转换器:
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和另一种我不记得的方法。 转换器有一个断点,并在我尝试的所有解决方案中被调用。但不知何故,“背景”属性似乎忽略了转换器的返回值。所以我猜我的错(或者我缺乏理解)有另一个来源。
有人想指出我正确的方向吗?
答案 0 :(得分:3)
如果我正确地解释了您的XAML - 您正在绘制列HEADER(“最顶层”单元格),而不是单元格本身。
这对我有用:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="{Binding Status},
Converter={StaticResource StatusToColorConverter}">
</Setter>
</Style>
</DataGrid.CellStyle>
这应该画你的细胞
作为旁注:如果你正在绘制他们的背景,你的细胞可能看起来很“奇怪” - 我的细胞经常失去他们的边界等。快速简单的解决方法是添加以下属性Setter(它是默认的wpf样式)
<Setter Property="BorderThickness" Value="1,0,1,1"></Setter>
<Setter Property="BorderBrush" Value="#FF000000"></Setter>
答案 1 :(得分:1)
我是这样做的:
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background">
<Setter.Value>
<Binding Path="Row" Mode="OneWay" />
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
请注意,我使用DataView作为DataSrid的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;
}
答案 2 :(得分:0)
好的伙计们。我现在解决了这个问题。 问题不在于我的xaml代码。转换器工作也很好。问题是转换器.cs文件中的以下行:
using System.Drawing;
我用正确的替换它:
using System.Windows.Media;
现在它就像一个魅力。 ... 我正在为WinForms而不是WPF Brushes传递Brushes!
感谢所有帮助:)