我有一个这样的课:
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;
}
My TextBoxes绑定到ViewModel的Name和Age。 如果我在ViewModel中更改_person对象,我是否必须再次为每个属性调用一个RaisePropertyChanged,或者是否有办法自动执行此操作(在我的concret示例中,我有大约15个属性..)?
感谢您的帮助。
干杯 约瑟夫
答案 0 :(得分:91)
您可以使用null
或string.Empty
为PropertyChangedEventArgs
中的媒体资源名称指明所有已更改的媒体资源。这在PropertyChanged的文档中提到。
答案 1 :(得分:0)
我用来解决问题的另一个解决方案是:首先设置值,然后调用PropertyChangedEventArgs
,方法是在Set
中添加一个ViewModelBase
函数,如下所示: / p>
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);
}