用特定颜色为第三行上色



我已经研究了很多关于如何更改行的背景色的内容,但所有的示例都是基于行中的值。有没有其他方法可以为特定的行号上色?我有一个项目,只有第三行的背景颜色为绿色。另一个项目需要行1到5获得橙色背景色。

我的第一个想法是添加一个Index列并填充它,然后根据该值设置背景行的颜色。这是唯一的方法吗?

<DataGrid x:Name="grdRes" ItemsSource="{Binding Path=DvAirports, Mode=OneWay}" 
HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" 
CanUserAddRows="False" CanUserDeleteRows="False"
Style="{DynamicResource Esri_DataGrid}" Margin="0,0,0,31">
<DataGrid.Columns>
<DataGridTextColumn Header="Origin" Binding="{Binding Origin}"/>
<DataGridTextColumn Header="Proximity" Binding="{Binding Proximity}"/>
<DataGridTextColumn Header="NAME" Binding="{Binding NAME}"/>
<DataGridTextColumn Header="Range" Binding="{Binding Range, StringFormat=N2}"/>
</DataGrid.Columns>

好的,所以我最终添加了一个Idx字段,然后关闭了它。我还隐藏了该列,因为分析不需要它。网格是CanUserSortColumns=";false";因此用户不能对行进行排序。它就像我想要的那样工作。

<DataGrid x:Name="grdRes" ItemsSource="{Binding Path=DvAirports, Mode=OneWay}" 
HeadersVisibility="Column" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" 
CanUserAddRows="False" CanUserDeleteRows="False" CanUserSortColumns="false"
Style="{DynamicResource Esri_DataGrid}" Margin="0,0,0,31">
<DataGrid.Columns>
<DataGridTextColumn Header="Origin" Binding="{Binding Origin}"/>
<DataGridTextColumn Header="Proximity" Binding="{Binding Proximity}"/>
<DataGridTextColumn Header="NAME" Binding="{Binding NAME}"/>
<DataGridTextColumn Header="Range" Binding="{Binding Range, StringFormat=N2}"/>
<DataGridTextColumn Header="Idx" Binding="{Binding Idx}" Visibility="Hidden"/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding Idx}" Value="2">
<!--if its the third row (Idx=2) then color green--> 
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>

概述

突出显示任何项应基于数据,而不是项控件中任何项的索引。原因很简单,就是视图中的索引和可以保留的数据项之间没有关联。当排序、筛选、分组或任何移动索引及其相应项的操作(如删除或插入项(时,会使项控件中的索引引用不同的项。

理想情况下,您应该公开一个表示特殊情况的属性,您可以为其添加触发器以适应视觉状态。这可以简单到像IsSpecial一样的bool,甚至可以简单到作为具有传递意义的数据索引的int。正如您已经展示的,这可以使用样式来完成。

<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSpecial}" Value="True">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>

特殊情况下脏

尽管不可取且肮脏,但如果您的应用程序中不需要交替索引,则有一种方法可以使用显示索引进行行着色。交替索引用于对每个n行进行不同的着色,其中n是交替计数。为此,提供了一个附加属性AlternationIndex。现在,如果将AlternationCount设置为项数,则AlternationIndex属性将有效地在视图中提供索引。基于此属性,您可以添加触发器。

<DataGrid ItemsSource="{Binding YourItems}"
AlternationCount="{Binding YourItems.Count}"
...>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="AlternationIndex" Value="2">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>

您将需要一个公开Count属性(如ObservableCollection<T>List<T>(的集合,或者一个将项数公开为Length的数组。请注意,这种方法存在与上述相同的问题,因此只有当指数和相应项目始终保持不变时,才是一种选择。

索引范围

如果要使用特殊模式检查范围或索引,可以创建转换器。

public class IsInRangeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is int intValue) || !(parameter is string rangeString))
return Binding.DoNothing;
var range = rangeString.Split(",");
if (range.Length != 2 ||
!int.TryParse(range[0], out var lowerLimit) ||
!int.TryParse(range[1], out var upperLimit) ||
lowerLimit < 0 ||
upperLimit < 0 ||
lowerLimit > upperLimit)
return Binding.DoNothing;
return intValue >= lowerLimit && intValue <= upperLimit;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException();
}
}

然后您可以使用DataTrigger中的转换器,并将该范围作为参数传递。

<DataGrid ItemsSource="{Binding StringItems}"
AlternationCount="{Binding StringItems.Count}"
...>
<DataGrid.Resources>
<local:IsInRangeConverter x:Key="IsInRangeConverter"/>
</DataGrid.Resources>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource Self}, Converter={StaticResource IsInRangeConverter}, ConverterParameter='3,5'}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>

如果需要绑定范围边界,则需要创建一个多值转换器。

相关内容

  • 没有找到相关文章

最新更新