You need to enable JavaScript to run this app. 通过EF6绑定现有SQL Server库到WPF DataGrid仅显示表头问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 02:36:06