通过EF6绑定现有SQL Server库到WPF DataGrid仅显示表头问题咨询
WPF DataGrid仅显示表头无数据行的问题修正
核心问题定位
结合你给出的代码片段,导致DataGrid无数据行的问题主要来自3处可直接复现的代码缺陷:
- 数据集合为空:
ColumnCollection仅做了空初始化,全程没有关联EF查询逻辑、把数据库里的5行测试数据填充到集合中,空集合绑定自然只会渲染表头,无数据行。 - 模型属性赋值存在递归bug:
Table1类的ID属性set块中,误把字段赋值写成了属性本身赋值(ID = value而非_ID = value),会触发无限递归栈溢出,即使数据被加载也会在绑定时报错中断。 - 集合属性未实现变更通知:
ColumnCollection的set方法没有触发属性变更事件,后续如果替换整个集合实例,绑定无法感知到数据变化。
逐部分修正代码
1. 修正Table1模型的属性逻辑
修正ID属性的赋值错误,优化属性通知的写法,避免硬编码属性名导致的拼写错误:
public class Table1 : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private int _ID; public int ID { get { return _ID; } set { // 修正原代码中ID = value的递归错误 _ID = value; RaisePropertyChanged(nameof(ID)); } } private string _Name; public string Name { get { return _Name; } set { _Name = value; RaisePropertyChanged(nameof(Name)); } } private void RaisePropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 完善ViewModel的EF数据加载逻辑
在ViewModel的构造函数中加入EF数据库查询逻辑,将查询到的数据填充到ObservableCollection中,同时补全集合属性的变更通知:
public class View1 : ViewModelBase { public event PropertyChangedEventHandler PropertyChanged; private ObservableCollection<Table1> _columnCollection = new ObservableCollection<Table1>(); public ObservableCollection<Table1> ColumnCollection { get { return _columnCollection; } set { _columnCollection = value; // 集合整体替换时触发通知,让绑定感知变化 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ColumnCollection))); } } public View1() { // 初始化时加载EF查询的数据 using (var dbContext = new EFContext()) { var queryResult = dbContext.SQLTestTable.ToList(); // 将查询到的实体逐个加入可观察集合 foreach (var entity in queryResult) { ColumnCollection.Add(entity); } } } private void RaisePropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
注:若使用的GalesoftMVVM的
ViewModelBase基类已经内置了INotifyPropertyChanged实现,可直接复用基类的通知方法,无需重复定义接口和事件。
3. 简化XAML的绑定逻辑
去掉ItemsSource绑定中多余的UpdateSourceTrigger参数(该参数适用于双向绑定的输入控件,对ItemsSource的单向数据传输无作用):
<DataGrid Grid.Row="1" Grid.RowSpan="6" x:Name="Datagrid" HeadersVisibility="Column" AutoGenerateColumns="False" ItemsSource="{Binding ColumnCollection}"> <DataGrid.Columns> <DataGridTextColumn Header="ID" Binding="{Binding ID}" /> <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> </DataGrid.Columns> </DataGrid>
排错校验清单
修正完代码后如果仍不显示数据,可按顺序排查:
- 确认MVVM定位器配置的视图DataContext对应的是上述带数据加载逻辑的ViewModel实例,而非空对象。
- 打开Visual Studio的输出面板,查看是否存在WPF绑定错误日志,定位是否存在找不到属性、类型不匹配的绑定异常。
- 在ViewModel构造函数的EF查询位置打断点,确认
SQLTestTable.ToList()能否正常返回5条测试数据:如果查询结果为空,需检查EF Code First的表名映射是否和实际数据库表一致(EF默认会将Table1实体映射为Table1s命名的表,和实际表名不符时会查不到数据)、数据库连接字符串是否配置正确。 - 排查是否存在运行时的栈溢出异常(即原ID属性递归赋值引发的错误),该异常会直接中断数据绑定流程。
内容的提问来源于stack exchange,提问作者polygone321
相关产品推荐
相关产品推荐

