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

WPF MVVM中DataGrid选中项无法同步到TextBox的问题排查

排查WPF MVVM中DataGrid选中项后TextBox不显示数据的问题

嘿,我帮你梳理下这个问题,咱们一步步来排查修复:

1. TextBox的Binding路径没指向选中的员工对象

你的TextBox直接绑定了LastName和FirstName,但这些属性是属于SelectedEmployee(选中的员工DTO)的,而不是ViewModel直接拥有的。所以得调整Binding路径,明确指向SelectedEmployee下的属性:

修改后的TextBox代码:

<TextBox Height="27" Margin="6,6,6,5" Text="{Binding SelectedEmployee.LastName, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Height="27" Margin="6,6,6,5" Text="{Binding SelectedEmployee.FirstName, UpdateSourceTrigger=PropertyChanged}"/>

2. SelectedEmployee属性未触发PropertyChanged通知

当你在DataGrid选中员工时,ViewModel里的SelectedEmployee会被赋值,但它的setter没有调用OnPropertyChanged方法——UI根本不知道这个属性变了,自然不会更新TextBox的内容。

修复ViewModel里的SelectedEmployee属性:

public EmployeeDTO SelectedEmployee {
  get { return selectedEmployee; }
  set {
    selectedEmployee = value;
    OnPropertyChanged(nameof(SelectedEmployee)); // 触发属性变更通知
  }
}

3. 额外的小问题(建议顺手修复)

虽然不影响当前的显示功能,但这些小问题可能会埋下隐患:

  • EmployeeDTO的HireDate setter里写了HireDate = value;,这会导致递归调用setter,改成:
    public DateTime? HireDate {
      get { return hireDate; }
      set {
        hireDate = value;
        OnPropertyChanged(nameof(HireDate)); // 加上通知更规范
      }
    }
    
  • DisplayBirthDate的getter每次都重新赋值字段,而且如果birthDate是null,ToString()会报错,优化一下:
    public string DisplayBirthDate {
      get { 
        return birthDate.HasValue ? birthDate.Value.ToString("yyyy-MM-dd") : "无"; 
      }
    }
    

做完这些修改后,再去选中DataGrid里的员工,TextBox应该就能正常显示对应的LastName和FirstName啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:27:27