C#WPF根据数据长度编辑datagrid单元格颜色
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#WPF根据数据长度编辑datagrid单元格颜色相关的知识,希望对你有一定的参考价值。
我有一个数据网格,如果单元格文本超过32个字符,我想让单元格变红。
我已经看到其他解决方案基于何时单元格文本是特定文本,但我不知道如何在这里使用这些解决方案
我的XAML如下
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5"></DataGrid>
要将我的数据放入i中,请将其读入名为dt的DataTable中,并执行以下操作。
DataGridView1.DataContext = dt.DefaultView;
UPDATE
使用Daniel W.的一些代码我已经让它部分工作了,我现在只需要收尾。
通过执行以下操作,我已将其用于1列:
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Address1}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Address1, Converter={StaticResource brushConverter}}">
</Setter>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
然而,这确实搞乱了我的数据表的格式
https://i.gyazo.com/525ce05a30cad36458a6734d6c61a0ff.png
正如您所看到的,我想要编辑的'address1'列不会被编辑,而是在常规列的左侧创建一个新列。
现在,我不能定义每列,因为列名可以在运行时更改,所以我不知道我绑定它
我需要一个只作为模板的解决方案,因为我的列没有定义,直到我在csv中读取,它可以有任意数量的列/名称,所以我不能对这些列进行数据绑定
有任何想法吗?
Manual defined colums
您可以根据长度使用绑定到Foreground / Background转换字符串的转换器:
public class LengthToBrush : IValueConverter
{
private const int _colorBorders = 0;
private const int _pow = 2;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var stringValue = value as String;
if (stringValue == null || stringValue.Length <=32) return new SolidColorBrush(Colors.Black);
return new SolidColorBrush(Colors.Red);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
将转换器添加到资源
<Window.Resources>
<converters:LengthToBrush x:Key="brushConverter"/>
</Window.Resources>
并在列定义中使用它
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Foreground="{Binding Name, Converter={StaticResource brushConverter}}"/>
</DataGrid.Columns>
</DataGrid>
Auto generated colums
如果要使用自动生成的列,则必须使用DataGridCell的样式
为此需要一个不同的转换器,如果前景应为红色,则返回true:
public class LengthToBool : IValueConverter
{
private const int _colorBorders = 0;
private const int _pow = 2;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var stringValue = value as String;
if (stringValue == null || stringValue.Length > 12) return true;
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
可以在xaml文件中定义样式:
<Window.Resources>
<local:LengthToBool x:Key="lengthConverter"/>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self},
Path=Content.Text, Converter={StaticResource lengthConverter}}" Value="True" >
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Window.Resources>
数据网格的定义可以很简单:
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding Collection}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">
</DataGrid>
以上是关于C#WPF根据数据长度编辑datagrid单元格颜色的主要内容,如果未能解决你的问题,请参考以下文章
无法编辑我的 DataGrid WPF Framework 4.5 的单元格
WPF DataGrid - 以编程方式将单元格设置为编辑模式