WPF数据绑定为何自动显示string的Length属性?
问题原因与解决方案
嘿,这个问题我之前也踩过坑!其实这是WPF DataGrid的默认行为在搞鬼:
为什么会出现Length列?
当你把DataGrid的ItemsSource绑定到值类型(比如string)的集合时,DataGrid默认会开启AutoGenerateColumns(默认值是True),它会自动遍历绑定对象的所有公共属性,为每个属性生成一列。而string类型正好有一个公共的Length属性,所以就被自动生成了额外的列——哪怕你完全没手动配置它。
看你的XAML代码,虽然你手动定义了一个模板列,但因为没关闭自动生成列的功能,DataGrid就同时显示了你手动加的列和自动生成的Length列。
解决方法(两种可选)
方法一:关闭自动生成列(推荐,适合你当前的场景)
直接在DataGrid标签里添加AutoGenerateColumns="False",这样DataGrid就只会显示你手动定义的列,不会自动生成其他列了。修改后的XAML如下:
<DataGrid ItemsSource="{Binding Users.NewList}" Width="400" Height="200" Margin="182,158,210,61" AutoGenerateColumns="False"> <!-- 加上这一行 --> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding}"></TextBlock> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
方法二:拦截自动生成列的过程(适合需要保留部分自动生成列的场景)
如果你之后需要自动生成其他属性列,但只想排除Length列,可以给DataGrid添加AutoGeneratingColumn事件,在事件处理里判断列名,如果是"Length"就取消生成:
首先修改XAML添加事件:
<DataGrid ItemsSource="{Binding Users.NewList}" Width="400" Height="200" Margin="182,158,210,61" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"> <!-- 你的列定义 --> </DataGrid>
然后在MainWindow.cs里添加事件处理方法:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { // 如果列绑定的属性是Length,取消生成该列 if (e.PropertyName == "Length") { e.Cancel = true; } }
这样就能保留自动生成的其他列,同时去掉不需要的Length列。
内容的提问来源于stack exchange,提问作者Mark Denom
相关产品推荐
相关产品推荐

