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】:
假设BackgroundColor
是System.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 中,您需要 <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>
然后将 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显示多行