我正在编写一个快速而又脏的WPF应用程序作为一个完整的WPF新手。我有一个简单的数据网格:
<DataGrid ItemsSource="{Binding Path=BetterFoods}" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="True" Loaded="DataGrid_Loaded">
<DataGrid.Resources>
<local:ValueColorConverter x:Key="colorconverter"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF0033"/>
</DataGrid.Resources>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource colorconverter}}"/>
</Style>
</DataGrid.CellStyle>
</DataGrid>
数据网格由简单的IValueConverter
着色,几乎与教程和Stack Overflow中的大量示例相同:
class ValueColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return Brushes.Beige;
}
else if (value is string)
{
string str = ((string)value).Trim();
if (str.Equals(string.Empty))
{
return Brushes.Beige;
}
else if (str.Equals("0"))
{
return Brushes.LightYellow;
}
}
return System.Windows.DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
IValueConverter
的工作方式与它应该完全相同,但它引入了一个奇怪的副作用:选择一行会使其单元格中的所有值消失。值仍然存在,因为更改选择或双击单元格会使它们再次可见(请参阅下面的.gif文件)。
这显然是不幸的,因为人们通常会突出显示一行来仔细查看其数据。
导致此行为的原因是什么?如何解决?
答案 0 :(得分:3)
添加一个资源(SystemColors.HighlightTextBrushKey),将文本画笔更改为更暗的颜色,以便您可以实际看到文本:
<DataGrid ItemsSource="{Binding Path=BetterFoods}" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="True">
<DataGrid.Resources>
<local:ValueColorConverter x:Key="colorconverter"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF0033"/>
<!-- ADDED: -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
</DataGrid.Resources>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource colorconverter}}"/>
</Style>
</DataGrid.CellStyle>
</DataGrid>