You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中DataGridView的ComboBox下拉内容不显示问题求助

排查与解决DataGridView中ComboBox下拉列表不显示内容的问题

我帮你梳理了几个核心问题点,一步步来解决:

一、核心原因分析

1. EF Core 无法自动持久化 List<string> 类型属性

你的SubInvoice类中的Status是List<string>类型,EF Core 默认不支持直接存储这种简单字符串集合(仅支持实体集合)。所以尽管你在迁移初始化时给Status赋了值,但实际数据库中这个字段要么没被创建,要么加载时Status始终为null,导致ComboBox绑定的数据源为空,自然看不到下拉内容。

2. (次要)集合类型缺少变更通知支持

List<string>本身不实现INotifyCollectionChanged接口,就算后续动态修改集合内容,UI也不会自动更新。不过当前问题是初始化不显示,这个是后续优化点,但建议一起修复。

3. (无关但需修正)XAML列定义混淆

你有两个Header="Status"的列,第一个实际绑定的是Date属性用DatePicker,这会造成UI混淆,建议修正。


二、分步解决方案

步骤1:修复EF Core对List<string>的持久化

推荐两种方式,按需选择:

方式A:用ValueConverter序列化集合为JSON

在你的DbContext的OnModelCreating方法中添加配置,让EF Core把List<string>序列化为JSON字符串存储:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SubInvoice>()
        .Property(s => s.Status)
        .HasConversion(
            v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
            v => JsonSerializer.Deserialize<List<string>>(v, (JsonSerializerOptions)null)
        );
}

之后重新生成迁移并更新数据库:

Add-Migration AddStatusJsonSerialization
Update-Database
方式B:改用ObservableCollection<string>并配置为Owned Entity(更适合WPF)

如果后续需要动态修改Status选项,直接用支持变更通知的ObservableCollection<string>:
先修改SubInvoice类:

public ObservableCollection<string> Status { get; set; } = new ObservableCollection<string>();

再在DbContext中配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SubInvoice>()
        .OwnsOne(s => s.Status, b =>
        {
            b.ToJson(); // EF Core 5+支持JSON存储
        });
}

这种方式既能正确持久化,还能让UI自动响应集合内容变化。

步骤2:更新SubInvoiceWrapper的属性定义

如果用了ObservableCollection<string>,同步修改Wrapper:

public ObservableCollection<string> Status 
{ 
    get { return GetValue<ObservableCollection<string>>(); } 
    set { SetValue(value); } 
}

确保你的ModelWrapper<T>能正确触发PropertyChanged通知(成熟的Wrapper实现一般都支持)。

步骤3:修正XAML的列Header错误

把第一个DataGridTemplateColumn的Header改为"Date",避免混淆:

<DataGridTemplateColumn Header="Date" Width="*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <DatePicker SelectedDate="{Binding Date,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

步骤4:调试验证

可以在InitializeSubInvoice方法中加断点,查看subInvoice.Status是否为null或空集合:

private void InitializeSubInvoice(ICollection<SubInvoice> invoices)
{
    foreach (var subInvoice in invoices)
    {
        // 输出到调试窗口查看Status状态
        System.Diagnostics.Debug.WriteLine($"当前Invoice的Status数量:{subInvoice.Status?.Count ?? 0}");
        var wrapper = new SubInvoiceWrapper(subInvoice);
        Invoices.Add(wrapper);
        wrapper.PropertyChanged += SubInvoiceWrapper_PropertyChanged;
    }
}

如果输出是0或null,说明EF Core加载有问题,优先检查步骤1的配置。

内容的提问来源于stack exchange,提问作者Maya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:28:58