You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免WPF工具提示覆盖DataGridCell默认样式

解决方案:避免DataGridCell自定义样式覆盖默认旋转布局

问题根源是:当你直接定义Style TargetType="DataGridCell"时,该样式不会自动继承全局默认的DataGridCell样式,导致原有旋转布局、模板等关键设置被覆盖,最终单元格显示异常。

以下是两种可行的解决方法:


方法1:基于默认样式继承扩展

在自定义CellStyle时,通过BasedOn属性绑定全局默认样式,保留原有旋转布局的同时叠加你的校验逻辑:

<DataGridTextColumn.CellStyle>
    <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Setter Property="ToolTip" >
            <Setter.Value>
                <ToolTip Visibility="{Binding Path=TaxTT, Converter={StaticResource StringToVisibleTT}}" >
                    <TextBlock Text="{Binding TaxTT}" />
                </ToolTip>
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="{Binding Path=TaxTT, Converter={StaticResource FormattingConverterTT}}"/>
    </Style>
</DataGridTextColumn.CellStyle>

关键说明

BasedOn="{StaticResource {x:Type DataGridCell}}"会自动应用全局定义的隐式DataGridCell样式。如果你的全局样式设置了x:Key(比如x:Key="DefaultDataGridCellStyle"),则需要将BasedOn的值改为对应Key:BasedOn="{StaticResource DefaultDataGridCellStyle}"。


方法2:将校验逻辑整合到全局样式(推荐)

如果多个列都需要类似的校验标记,可以把tooltip和前景色逻辑直接合并到全局DataGridCell样式中,避免重复定义:

修改全局样式:

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Focusable" Value="False" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="LayoutTransform">
        <Setter.Value>
            <TransformGroup>
                <RotateTransform Angle="-90"/>
                <ScaleTransform ScaleX="1" ScaleY="-1" />
            </TransformGroup>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Grid Background="{DynamicResource AppGlobalBackground}">
                    <ContentPresenter VerticalAlignment="Center"
                                      HorizontalAlignment="Left"/>
                    <TextBlock>
                        <ContentPresenter Margin="0,2,10,2"/>
                    </TextBlock>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <!-- 新增校验相关设置 -->
    <Setter Property="ToolTip" >
        <Setter.Value>
            <ToolTip Visibility="{Binding Path=ValidationTooltip, Converter={StaticResource StringToVisibleTT}}" >
                <TextBlock Text="{Binding ValidationTooltip}" />
            </ToolTip>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="{Binding Path=ValidationTooltip, Converter={StaticResource FormattingConverterTT}}"/>

    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource AppGlobalBackground}" />
            <Setter Property="Foreground" Value="{DynamicResource AppGlobalForeground}" />
            <Setter Property="BorderBrush" Value="{DynamicResource AppGlobalBackground}" />
        </Trigger>

        <Trigger Property="IsFocused" Value="True">
            <Setter Property="IsSelected" Value="True" />
        </Trigger>
    </Style.Triggers>
</Style>

之后在ViewModel中给每个需要校验的字段对应一个ValidationTooltip属性(比如Tax字段对应TaxTT,其他字段同理),所有列会自动应用校验样式,同时保留原有的旋转布局。


内容的提问来源于stack exchange,提问作者Dr Hoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:50:27