WPF中DataGridTextColumn绑定Bool转颜色转换器失效问题排查
WPF DataGridTextColumn Foreground绑定报错的原因与解决方法
错误原因
报错Cannot find governing FrameworkElement or FrameworkContentElement for target element的核心问题是:DataGridTextColumn不属于可视化树元素,它只是列的定义模板,没有自己的DataContext。直接给它的Foreground属性绑定模型属性时,绑定系统无法找到对应的数据源实例(即你的数据模型),因此抛出找不到DataItem的错误。
而Diameter属性能正常绑定,是因为该Binding作用于单元格内部生成的TextBlock(可视化元素),该元素会继承DataGrid行的DataContext,所以能正确找到模型中的属性。
解决方案
方法1:通过ElementStyle绑定Foreground
修改XAML中的DataGridTextColumn,将Foreground绑定放到ElementStyle中,作用于单元格内的TextBlock(可视化元素):
<DataGridTextColumn Header="Diameter 
(mm)" Binding="{Binding Diameter, Mode=TwoWay, StringFormat={}{0:n0}, Converter={StaticResource UnitConverter}, ConverterParameter=1000}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="{Binding DiameterCustom, Converter={StaticResource CustomColourConverter}}"/> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn>
方法2:同时支持显示与编辑状态的颜色绑定
如果需要单元格处于编辑状态(比如激活TextBox)时也保持颜色效果,可以同时设置EditingElementStyle:
<DataGridTextColumn Header="Diameter 
(mm)" Binding="{Binding Diameter, Mode=TwoWay, StringFormat={}{0:n0}, Converter={StaticResource UnitConverter}, ConverterParameter=1000}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="{Binding DiameterCustom, Converter={StaticResource CustomColourConverter}}"/> </Style> </DataGridTextColumn.ElementStyle> <DataGridTextColumn.EditingElementStyle> <Style TargetType="TextBox"> <Setter Property="Foreground" Value="{Binding DiameterCustom, Converter={StaticResource CustomColourConverter}}"/> </Style> </DataGridTextColumn.EditingElementStyle> </DataGridTextColumn>
验证说明
你的转换器代码和模型属性定义没有问题,只要将绑定目标切换到可视化元素(TextBlock/TextBox),就能正确触发转换器,根据DiameterCustom的bool值切换文本颜色。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

