我有一个数据网格,如果单元格文本超过32个字符,我想将单元格设为红色。
基于单元格文本是特定文本时,我已经看到了其他解决方案,但是我不确定如何在此处使用这些解决方案
我的XAML如下
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5"></DataGrid>
要放入我的数据,请将其读入名为dt的DataTable中,然后执行以下操作。
DataGridView1.DataContext = dt.DefaultView;
更新
使用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时,我的列才被定义,csv可以具有任意数量的列/名称,因此我无法将数据绑定到这些列
有什么想法吗?
答案 0 :(得分:1)
您可以根据长度使用绑定到前景/背景转换字符串的转换器:
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>
如果要使用自动生成的列,则必须为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>