web-dev-qa-db-ja.com

C#/ WPF:ViewModelのすべてのプロパティのPropertyChanged?

私はこのようなクラスを持っています:

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のプロパティがあります)。

助けてくれてありがとう。

乾杯ジョセフ

nullのプロパティ名にPropertyChangedEventArgsまたはstring.Emptyを使用すると、すべてのプロパティが変更されたことを示すことができます。これは PropertyChanged のドキュメントで言及されています。

97
Phil Devaney

最初に値を設定してからPropertyChangedEventArgsを呼び出すという問題に取り組むために使用したもう1つの解決策は、SetViewModelBase関数を追加することです。

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);
} 
0
JoshuaRMS