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

WPF DataGrid DataTemplate内控件ToolTip动态绑定列值实现方案

解决方案

你的绑定失效核心原因是给PackIcon显式设置了独立的DataContext为local:TestClass实例,这个上下文和DataGrid当前行绑定的业务实体完全割裂,无法获取到同行其他列对应的MinRange、MaxRange属性值。

优先推荐实现(无额外性能开销)

直接删除PackIcon下手动赋值的DataContext节点,让控件默认继承当前DataGrid行的DataContext(也就是每行绑定的业务实体对象,本身就包含所有列的属性),再通过多值绑定拼接需要的ToolTip文本即可。
修正后的完整DataTemplate代码:

<UserControl.Resources>
    <DataTemplate x:Key="PositionAdded">
        <materialDesign:PackIcon 
            x:Name="PositionInd"  
            Kind="TimerSandEmpty" 
            HorizontalAlignment="Center"  
            Foreground="DarkOrange" 
            Width="20" 
            Height="20">
            <!-- 拼接MinRange和MaxRange生成目标格式提示 -->
            <materialDesign:PackIcon.ToolTip>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} to {1}">
                            <Binding Path="MinRange" />
                            <Binding Path="MaxRange" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </materialDesign:PackIcon.ToolTip>
        </materialDesign:PackIcon>
    </DataTemplate>
</UserControl.Resources>

特殊场景实现(需保留TestClass作为DataContext时使用)

如果你因为业务需求必须保留PackIcon的DataContext为TestClass实例,可以通过RelativeSource向上查找DataGridRow,获取行级别的DataContext再绑定属性,代码如下:

<UserControl.Resources>
    <DataTemplate x:Key="PositionAdded">
        <materialDesign:PackIcon 
            x:Name="PositionInd"  
            Kind="TimerSandEmpty" 
            HorizontalAlignment="Center"  
            Foreground="DarkOrange" 
            Width="20" 
            Height="20">
            <materialDesign:PackIcon.DataContext>
                <local:TestClass />
            </materialDesign:PackIcon.DataContext>
            <materialDesign:PackIcon.ToolTip>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} to {1}">
                            <Binding Path="DataContext.MinRange" RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
                            <Binding Path="DataContext.MaxRange" RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </materialDesign:PackIcon.ToolTip>
        </materialDesign:PackIcon>
    </DataTemplate>
</UserControl.Resources>

注意事项

  • 用CellTemplateSelector返回的其他单元格模板,只要不手动重写控件的DataContext,默认都会继承当前行的业务实体上下文,直接绑定实体属性即可。
  • ToolTip绑定外层套TextBlock是为了兼容WPF的属性类型转换逻辑,避免直接给ToolTip属性绑多值时出现StringFormat不生效的问题。
  • 确保绑定的实体类公开了MinRange、MaxRange属性,如果运行时需要动态修改这两个值,在实体类上实现INotifyPropertyChanged接口即可实时更新提示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:42:15