IT이야기

C # / WPF : ViewModel의 모든 속성에 대한 PropertyChanged?

cyworld 2021. 3. 31. 21:18
반응형

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의 이름과 나이에 바인딩됩니다. ViewModel에서 _person 개체를 변경하면 각 속성에 대해 RaisePropertyChanged를 다시 호출해야합니까? 아니면이를 자동으로 수행 할 수있는 방법이 있습니까 (내 구체적인 예에서는 약 15 개의 속성이 있습니다.)?

도움을 주셔서 감사합니다.

건배 조셉


당신은 모든 속성을 사용하여 변경된 표시 할 수 있습니다 null또는 string.Empty에서 속성 이름 PropertyChangedEventArgs. 이것은 PropertyChanged 문서에 언급되어 있습니다.


문제를 해결하는 데 사용한 또 다른 해결책은 다음과 같습니다. 먼저 값을 설정 한 다음을 호출하는 PropertyChangedEventArgs것은 다음과 같은 Set함수를 추가하는 것입니다 ViewModelBase.

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

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

반응형