DataGrid绑定属性为特定值时如何用圆形覆盖单元格内容?
这个需求完全可以通过触发器实现,不需要额外新增绑定属性,两种方案可根据场景选择:
方案1:DataTemplate触发器(适合单/少量列自定义场景)
把原有的DataGridTextColumn替换为DataGridTemplateColumn,单元格模板内同时放置文本和圆形控件,通过触发器判断绑定值直接切换可见性,无需修改ViewModel代码:
<DataGridTemplateColumn Width="50" SortMemberPath="Price"> <DataGridTemplateColumn.Header> <TextBlock Text="{Binding Path=Price}"/> </DataGridTemplateColumn.Header> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid> <TextBlock x:Name="PriceText" Text="{Binding Price}" HorizontalAlignment="Center" VerticalAlignment="Center"/> <Ellipse x:Name="InvalidDot" Width="8" Height="8" Fill="Red" Visibility="Collapsed" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Price}" Value="-"> <Setter TargetName="PriceText" Property="Visibility" Value="Collapsed"/> <Setter TargetName="InvalidDot" Property="Visibility" Value="Visible"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
方案2:DataGridCell样式触发器(适合多列统一规则场景)
如果有大量列都遵循「值为-时显示圆形」的规则,直接重写DataGridCell的控件模板即可,原有所有DataGridTextColumn不需要做任何修改,复用性更高:
<DataGrid.Resources> <Style TargetType="DataGridCell"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="DataGridCell"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <Grid> <ContentPresenter x:Name="CellContent" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> <Ellipse x:Name="InvalidDot" Width="8" Height="8" Fill="Red" Visibility="Collapsed" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="Content" Value="-"> <Setter TargetName="CellContent" Property="Visibility" Value="Collapsed"/> <Setter TargetName="InvalidDot" Property="Visibility" Value="Visible"/> </Trigger> <!-- 保留原有选中高亮逻辑,可根据需求调整 --> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </DataGrid.Resources>
如果需要不同列的圆形样式不同,给对应列单独设置CellStyle即可,无需全局生效。
内容的提问来源于stack exchange,提问作者Joan Venge
相关产品推荐
相关产品推荐

