web-dev-qa-db-fra.com

C # / WPF: Procéditement pour toutes les propriétés dans ViewModel?

J'ai une classe comme celle-ci:

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

Mes boîtes de texte sont liées au nom et à l'âge de la viewModel. Si je change l'objet _Person dans la vue, dois-je appeler à nouveau pour chaque propriété un épargne-ut-utilité ou y a un moyen de le faire automatiquement (dans mon exemple de concret, j'ai environ 15 propriétés ..)?

Merci pour toute aide.

Bravo Joseph

Vous pouvez indiquer que toutes les propriétés ont changé en utilisant null ou string.Empty Pour le nom de propriété dans PropertyChangedEventArgs. Ceci est mentionné dans la documentation pour PropertyChanged .

97
Phil Devaney

Une autre solution que j'ai utilisé pour aborder le problème de: définit d'abord la valeur, puis appelant le PropertyChangedEventArgs est en ajoutant une fonction Set dans mon ViewModelBase qui ressemble à ceci:

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

Au lieu de faire cela:

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

Vous pouvez maintenant obtenir la même chose en faisant cela:

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