C#/WPF:ViewModel中所有属性的PropertyChanged?

k97glaaz  于 2022-11-18  发布在  C#
关注(0)|答案(2)|浏览(195)

我有一个这样的类:

public class PersonViewModel : ViewModelBase //Here is the INotifyPropertyChanged Stuff
{
    public PersonViewModel(Person person)
    {
        PersonEntity = person;
    }

    public Person PersonEntity { 
        get { return PersonEntity.Name; }
        private set { PersonEntity.Name = value; RaisePropertyChanged("PersonEntity");
    }

    public string Name { 
        get { return PersonEntity.Name; }
        set { PersonEntity.Name = value; RaisePropertyChanged("Name");
    } 
    public int Age{ 
        get { return PersonEntity.Age; }
        set { PersonEntity.Age= value; RaisePropertyChanged("Age");
    } 

    public void ChangePerson(Person newPerson)
    {
        //Some Validation..
        PersonEntity = newPerson;
    }

我的TextBox绑定到ViewModel的Name和Age。如果我更改ViewModel中的_person对象,是否必须再次为每个属性调用RaisePropertyChanged,或者是否有方法自动执行此操作(在我的具体示例中,我有大约15个属性..)?
谢谢你的帮助。
干杯约瑟夫

3zwtqj6y

3zwtqj6y1#

您可以使用nullstring.Empty做为PropertyChangedEventArgs中的属性名称,以表示所有属性都已变更。PropertyChanged的文件中会提到这一点。

8yoxcaq7

8yoxcaq72#

我用来解决这个问题的另一个解决方案是:首先设置值,然后调用PropertyChangedEventArgs,方法是在ViewModelBase中添加一个Set函数,如下所示:

public class ViewModelBase : INotifyPropertyChanged
{
    protected bool Set<T>(ref T backingField, T value, [CallerMemberName] string propertyname = null)
    {
        // Check if the value and backing field are actualy different
        if (EqualityComparer<T>.Default.Equals(backingField, value))
        {
            return false;
        }

        // Setting the backing field and the RaisePropertyChanged
        backingField = value;
        RaisePropertyChanged(propertyname);
        return true;
   }
}

而不是这样做:

public string Name { 
    get { return PersonEntity.Name; }
    set { PersonEntity.Name = value; RaisePropertyChanged("Name");
}

现在,您可以通过执行以下操作来实现相同的效果:

public string Name { 
    get { return PersonEntity.Name; }
    set { Set(ref PersonEntity.Name,value);
}

相关问题