如何在WPF DataGrid中修改列时实时刷新关联列
解决WPF DataGrid中计算属性随输入实时更新的问题
嘿,我明白你的需求——当用户修改Name列内容时,Width of Name列要立刻算出新值并更新。这其实是WPF绑定系统中计算属性依赖通知的典型场景,下面一步步给你说怎么改:
1. 补全INotifyPropertyChanged的基础实现
首先得确保你的FormCreatorColumnInfoDatasource类的INotifyPropertyChanged接口实现到位,要有触发事件的辅助方法(如果还没加的话):
class FormCreatorColumnInfoDatasource : INotifyPropertyChanged { // 实现INotifyPropertyChanged接口的事件 public event PropertyChangedEventHandler PropertyChanged; // 封装触发事件的方法,用CallerMemberName省得手动写属性名 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } // 你原来的m_info、Name、WidthOfNameInCentimeter代码放在这里... }
2. 在Name的Setter里同时通知两个属性的变化
WidthOfNameInCentimeter是完全依赖Name的计算属性,所以当Name变了,不仅要告诉绑定系统“Name改了”,还要告诉它“WidthOfNameInCentimeter也跟着变了”。修改你的Name属性setter:
public string Name { get { return m_info.Name; } set { // 先判断值是否真的变了,避免无意义的通知 if (m_info.Name != value) { m_info.Name = value; // 通知Name属性更新 OnPropertyChanged(nameof(Name)); // 关键:通知计算属性也更新了 OnPropertyChanged(nameof(WidthOfNameInCentimeter)); } } }
3. 额外情况:如果m_info的Name可能被其他地方修改
如果你的IFormCreatorColumnInfo实现类(也就是m_info的实际类型)自己也实现了INotifyPropertyChanged,而且m_info.Name可能被FormCreatorColumnInfoDatasource之外的代码修改,那你还得监听m_info的变化,同步触发通知:
private IFormCreatorColumnInfo m_info; public IFormCreatorColumnInfo Info { get => m_info; set { // 先移除旧对象的事件监听(如果有的话) if (m_info is INotifyPropertyChanged oldNotify) { oldNotify.PropertyChanged -= OnInfoPropertyChanged; } m_info = value; // 给新对象添加事件监听 if (m_info is INotifyPropertyChanged newNotify) { newNotify.PropertyChanged += OnInfoPropertyChanged; } // 触发一次属性通知,确保UI同步 OnPropertyChanged(nameof(Name)); OnPropertyChanged(nameof(WidthOfNameInCentimeter)); } } private void OnInfoPropertyChanged(object sender, PropertyChangedEventArgs e) { // 当m_info的Name属性变化时,同步触发我们的属性通知 if (e.PropertyName == nameof(IFormCreatorColumnInfo.Name)) { OnPropertyChanged(nameof(Name)); OnPropertyChanged(nameof(WidthOfNameInCentimeter)); } }
可选:让输入时实时更新(不用等焦点离开)
默认情况下,WPF的文本框绑定是在焦点离开时才更新数据源。如果想要用户输入时Width of Name就实时变化,可以修改XAML里的Binding:
<DataGridTextColumn Header="Name" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/>
这样改完之后,你再去测试,修改Name列的内容,Width列就会立刻跟着变啦!
内容的提问来源于stack exchange,提问作者Gener4tor
相关产品推荐
相关产品推荐

