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的HireDatesetter里写了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
相关产品推荐
相关产品推荐

