为何DataGrid列Width绑定MultiConverter不生效,Visibility绑定却正常?
问题原因
- 直接绑定
DataGridTextColumn.Width不生效的原因DataGridTextColumn不属于WPF可视化树元素,属性绑定的隐式类型转换逻辑和普通控件不同:
Visibility属性是枚举类型,你的转换器返回的是匹配的Visibility枚举值,类型完全匹配,所以可以正常生效。Width属性的类型是DataGridLength结构体,你直接返回数值类型(int/double)时,非可视化树元素的绑定不会自动触发数值到DataGridLength的隐式转换,导致赋值失败;你之前尝试的SizeToHeader单位是适配表头宽度,不是固定像素值,自然不会得到你要的20像素宽度。
- 设置
ElementStyle中TextBlock.Width不生效的原因
你修改的只是单元格内部TextBlock控件的宽度,和DataGrid列本身的宽度是两个独立的属性:列的宽度默认会根据表头宽度、所有单元格的最大内容宽度自动计算,你只是把单元格内的TextBlock改窄,只会让TextBlock在单元格内留白,不会改变列本身的渲染宽度。
解决方案
修正你的多值转换器,显式返回像素单位的DataGridLength类型即可:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 显式指定宽度单位为像素,类型完全匹配DataGridColumn.Width的要求 return new DataGridLength(20, DataGridLengthUnitType.Pixel); }
如果仍有问题,可以在绑定中显式指定Mode=OneWay,避免默认绑定模式的影响:
<DataGridTextColumn.Width> <MultiBinding Converter="{StaticResource MyMultiValueConverter}" Mode="OneWay"> <Binding Source="{x:Reference ProxyElement}" Path="DataContext.MyProperty" /> <Binding Source="0"/> </MultiBinding> </DataGridTextColumn.Width>
另外要注意不要在DataGrid上设置全局的ColumnWidth属性覆盖单独列的宽度配置,也不要给当前列手动设置固定宽度值,避免绑定优先级被覆盖。
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

