WPF DataGrid如何获取选中行首单元格(用户ID)?
获取WPF DataGrid选中行的UserId(匿名类型集合场景)
方法1:使用动态类型(dynamic)
这是适配现有匿名类型的直接方案,匿名类型在同一程序集内可通过dynamic直接访问属性。
步骤1:在ViewModel中添加选中项属性
修改ViewModel,新增选中项的绑定属性,并在属性变化时获取UserId:
public partial class UserSalaryViewModel : ObservableObject { [ObservableProperty] private IEnumerable userssSalarires; [ObservableProperty] private object selectedUserSalary; // 匿名类型用object接收 public UserSalaryViewModel() { using AppDBContext db = new(); UserssSalarires = db.Users.Join(db.UserSalaries, u => u.UserId, us => us.UserId, (u, us) => new { u.UserId, u.FirstName, u.FatherName, u.NIC, u.Salary, us.Pay, us.Month, us.PayDate, us.Finance, us.Rest }).ToList(); } // 选中项变化时自动触发此方法 partial void OnSelectedUserSalaryChanged(object value) { if (value != null) { dynamic selectedItem = value; int userId = selectedItem.UserId; // 这里处理获取到的UserId,比如执行业务逻辑 Console.WriteLine($"选中的用户ID:{userId}"); } } }
步骤2:绑定DataGrid的SelectedItem
修改XAML,将选中项绑定到ViewModel的属性:
<DataGrid ItemsSource="{Binding UserssSalarires}" SelectedItem="{Binding SelectedUserSalary}" />
方法2:替换匿名类型为实体类(推荐)
匿名类型不利于类型安全和后续维护,建议创建专门的DTO类承载查询结果:
步骤1:创建DTO类
public class UserSalaryDto { public int UserId { get; set; } public string FirstName { get; set; } public string FatherName { get; set; } public string NIC { get; set; } public decimal Salary { get; set; } public decimal Pay { get; set; } public string Month { get; set; } public DateTime PayDate { get; set; } public decimal Finance { get; set; } public decimal Rest { get; set; } }
步骤2:修改ViewModel的查询逻辑
将匿名类型替换为UserSalaryDto,并更新集合类型:
public partial class UserSalaryViewModel : ObservableObject { [ObservableProperty] private IEnumerable<UserSalaryDto> userssSalarires; [ObservableProperty] private UserSalaryDto selectedUserSalary; public UserSalaryViewModel() { using AppDBContext db = new(); UserssSalarires = db.Users.Join(db.UserSalaries, u => u.UserId, us => us.UserId, (u, us) => new UserSalaryDto { UserId = u.UserId, FirstName = u.FirstName, FatherName = u.FatherName, NIC = u.NIC, Salary = u.Salary, Pay = us.Pay, Month = us.Month, PayDate = us.PayDate, Finance = us.Finance, Rest = us.Rest }).ToList(); } partial void OnSelectedUserSalaryChanged(UserSalaryDto value) { if (value != null) { int userId = value.UserId; // 处理业务逻辑 Console.WriteLine($"选中的用户ID:{userId}"); } } }
步骤3:XAML绑定不变
<DataGrid ItemsSource="{Binding UserssSalarires}" SelectedItem="{Binding SelectedUserSalary}" />
方法3:使用反射获取属性值
如果不想用dynamic也不想创建实体类,可通过反射读取匿名类型的UserId属性:
partial void OnSelectedUserSalaryChanged(object value) { if (value != null) { var userIdProperty = value.GetType().GetProperty("UserId"); if (userIdProperty != null) { int userId = (int)userIdProperty.GetValue(value); Console.WriteLine($"选中的用户ID:{userId}"); } } }
内容的提问来源于stack exchange,提问作者Ihsan Sadat
相关产品推荐
相关产品推荐

