首页 > 解决方案 > 自动更新 WPF 数据网格中的计算属性

问题描述

我有一个类TestModel,它有一个FirstName 和一个LastName 属性加上一个没有setter 但只是以“Lastname,Firstname”格式返回FullName 的“计算属性”。

public class TestModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get
        {
            return $"{LastName}, {FirstName}";
        } 
    }

}

我将此类的多个对象存储在 ObservableCollection 中,它是 WPF 应用程序中数据网格的 ItemsSource。当我通过 GUI 添加项目时,它们立即出现在网格中,一切都很好。

但是,例如,当我更改网格中一个特定对象的 FirstName 时,FullName 不会自动更改(实际上它确实会更改,但更改不会反映在 GUI 中)。我必须在这个类上实现 INotifyPropertyChanged 吗?如果是这样,我该怎么做?我读了一些例子,但我必须承认我无法将它们转移到我的案例中......

标签: c#wpfobservablecollection

解决方案


是的,您需要在视图模型中实现 INotifyPropertyChanged。

例子:

public class ViewModelBase: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    protected void RaisePropertyChanged(String propertyName)
    {
        VerifyPropertyName(propertyName);
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
}

将其添加到您的程序代码中,如下所示:

public class Testmodel : ViewModelBase
{
    private string _FistName;
    public string FirstName
    {
        get
        {
            return _FistName;
        }
        set
        {
            if(_FistName == value)
            {
                return;
            }
            _FistName = value;
            RaisePropertyChanged("FirstName");
            RaisePropertyChanged("FullName");
        }
    }
    private string _LastName;
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            if (_LastName == value)
            {
                return;
            }
            _LastName = value;
            RaisePropertyChanged("LastName");
            RaisePropertyChanged("FullName");
        }
    }
    public string FullName
    {
        get
        {
            return $"{LastName}, {FirstName}";
        }
    }
}

如果您现在将值设置为 FirstName 或 LastName,它应该引发更新 gui 的 PropertyChanged 事件。试试看 :)


推荐阅读