如何将WinUI3 CommunityToolkit DataGrid绑定多模型联合查询的ObservableProperty
解决WinUI3 DataGrid绑定LINQ关联查询结果的问题
步骤1:创建强类型DTO类
定义一个包含所需字段的实体类,替代匿名类型,这样就能作为可观察属性的类型使用:
public class JoinedTableDto { // 请根据Table1、Table2中对应字段的实际类型修改属性类型 public string ColumnA { get; set; } public string ColumnB { get; set; } public string ColumnC { get; set; } public string ColumnD { get; set; } }
步骤2:修改LINQ查询,生成DTO集合
将原LINQ查询中的匿名类型替换为上面创建的JoinedTableDto,并转换成ObservableCollection(DataGrid绑定需要可观察集合来支持UI更新):
IEnumerable<Table1> table1 = unitOfWorkDbGlobal.Table1.GetAll().ToList(); IEnumerable<Table2> table2 = unitOfWorkDbGlobal.Table2.GetAll().ToList(); var joinedItems = from t1 in table1 join t2 in table2 on t1.TestGuid equals t2.TestGuid select new JoinedTableDto { ColumnA = t1.ColumnA, ColumnB = t1.ColumnB, ColumnC = t2.ColumnC, ColumnD = t2.ColumnD }; // 转换为ObservableCollection并赋值给可观察属性 JoinedTables = new ObservableCollection<JoinedTableDto>(joinedItems);
步骤3:在ViewModel中添加可观察属性
现在可以用JoinedTableDto类型定义符合要求的可观察属性:
using CommunityToolkit.Mvvm.ComponentModel; using System.Collections.ObjectModel; public partial class YourViewModel : ObservableObject { [ObservableProperty] private ObservableCollection<JoinedTableDto>? _joinedTables; // 其他业务逻辑代码... }
步骤4:确认XAML绑定无需修改
你提供的XAML代码中,列绑定的ColumnA、ColumnB等字段名与JoinedTableDto的属性名完全匹配,因此原XAML可以直接使用,不需要调整。
额外说明
- 如果后续需要更新数据,直接操作
JoinedTables集合(如Add、Remove、Clear),ObservableCollection会自动通知UI刷新; - 如果需要重新加载全量数据,直接重新赋值
JoinedTables = new ObservableCollection<JoinedTableDto>(新查询结果)即可,[ObservableProperty]会自动触发PropertyChanged事件。
内容的提问来源于stack exchange,提问作者E. A. Bagby
相关产品推荐
相关产品推荐

