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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:05:20