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
相关产品推荐
相关产品推荐

