59 votes

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

J'ai une classe comme ça :

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 du ViewModel. Si je change l'objet _person dans le ViewModel, dois-je appeler à nouveau RaisePropertyChanged pour chaque propriété ou existe-t-il un moyen de le faire automatiquement (dans mon exemple concret, j'ai environ 15 propriétés ) ?

Merci pour toute aide.

Cheers Joseph

119voto

Phil Devaney Points 8595

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

2 votes

Super, je cherchais quelque chose comme ça depuis des mois Je devais toujours appeler RaisePropertyChanged pour chaque propriété dans mes ViewModels :-)

1 votes

Wow, c'est tellement utile, je ne peux pas croire que je ne le savais pas.

1voto

JoshuaRMS Points 11

Une autre solution que j'ai utilisée pour résoudre le problème suivant : il faut d'abord définir la valeur et ensuite appeler la fonction PropertyChangedEventArgs est d'ajouter un 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 ça :

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

Vous pouvez maintenant faire de même en procédant ainsi :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X