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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:12:31