C#/WPF: PropertyChanged for all Properties in ViewModel?

允我心安 提交于 2019-11-27 01:12:44

问题


I've a class like this:

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;
    }

My TextBoxes are bound to Name and Age of the ViewModel. If I change the _person object in the ViewModel, do I have to call for each Property a RaisePropertyChanged again or is there a way to do this automaticly (in my concret example I have about 15 Properties..)?

Thanks for any help.

Cheers Joseph


回答1:


You can indicate all properties have changed by using null or string.Empty for the property name in PropertyChangedEventArgs. This is mentioned in the documentation for PropertyChanged.




回答2:


One other solution I used to tackle the problem of: first setting the value and then calling the PropertyChangedEventArgs is by adding a Set function in my ViewModelBase which looks like this:

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;
   }
}

Instead of doing this:

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

You can now achieve the same by doing this:

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


来源:https://stackoverflow.com/questions/1859946/c-wpf-propertychanged-for-all-properties-in-viewmodel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!