Ответ 1
Вы можете указать, что все свойства были изменены с помощью null
или string.Empty
для имени свойства в PropertyChangedEventArgs
. Это упоминается в документации для 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;
}
Мои текстовые поля привязаны к имени и возрасту ViewModel. Если я изменю объект _person в ViewModel, мне нужно вызвать для каждого свойства снова 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);
}