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

使用MVVM Community Toolkit时DataGrid的ItemSource未更新

问题排查与解决方案

1. 集合类型不支持UI变更通知

你当前使用List<BelData>作为绑定集合,但List<T>未实现INotifyCollectionChanged接口——往集合内添加元素时,UI无法感知到集合内部的变化,自然不会更新DataGrid的显示。

解决方法:替换为WPF专用的绑定集合类型ObservableCollection<BelData>,它会自动向UI发送集合变更通知:

[ObservableProperty]
private ObservableCollection<BelData>? _belDatas = new();

2. 检查XAML绑定配置是否完整

(1)确认DataContext已正确设置

窗口必须将DataContext指向MainWindowViewModel的实例,否则绑定无法找到数据源:

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>

也可以在后台代码中设置:

public MainWindow()
{
    InitializeComponent();
    DataContext = new MainWindowViewModel();
}

(2)确认DataGrid的ItemsSource绑定正确

确保DataGrid的ItemsSource绑定到BelDatas属性:

<DataGrid ItemsSource="{Binding BelDatas}" AutoGenerateColumns="True"/>

如果需要手动指定列,需确保列的Binding路径与BelData的属性名完全匹配:

<DataGrid ItemsSource="{Binding BelDatas}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="单据编号" Binding="{Binding BelNummer}"/>
        <DataGridTextColumn Header="单据类型" Binding="{Binding BelTyp}"/>
        <DataGridTextColumn Header="单据日期" Binding="{Binding BelegDatum}"/>
    </DataGrid.Columns>
</DataGrid>

3. 确保BelData类的属性为公共可访问

BelData的属性必须是公共get/set属性,否则DataGrid无法通过反射读取属性值:

public class BelData
{
    public int BelNummer { get; set; }
    public int BelTyp { get; set; }
    public DateTime BelegDatum { get; set; }
}

4. 异步操作的线程校验(可选)

虽然await会自动切换回UI线程,但极端情况下如果集合更新在非UI线程执行,会导致UI不更新。可尝试强制在UI线程添加元素:

await Application.Current.Dispatcher.InvokeAsync(() =>
{
    BelDatas.Add(new BelData
    {
        BelNummer = int.Parse(rdr[0].ToString()),
        BelTyp = int.Parse(rdr[1].ToString()),
        BelegDatum = DateTime.Parse(rdr[2].ToString())
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:12:07