使用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
相关产品推荐
相关产品推荐

