【问题标题】:C#/WPF: PropertyChanged for all Properties in ViewModel?C#/WPF:ViewModel 中所有属性的 PropertyChanged?
【发布时间】:2010-12-24 00:22:12
【问题描述】:

我有这样的课:

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 的名称和年龄。 如果我更改 ViewModel 中的 _person 对象,我是否必须再次为每个属性调用 RaisePropertyChanged,或者是否有办法自动执行此操作(在我的具体示例中,我有大约 15 个属性..)?

感谢您的帮助。

干杯 约瑟夫

【问题讨论】:

    标签: c# wpf inotifypropertychanged


    【解决方案1】:

    您可以使用nullstring.Empty 作为PropertyChangedEventArgs 中的属性名称来指示所有属性已更改。 PropertyChanged 的文档中提到了这一点。

    【讨论】:

    • 太好了,几个月以来我一直在寻找这样的东西。我总是不得不为我的 ViewModels 中的每个属性调用 RaisePropertyChanged :-)
    • 哇这太有用了,我不敢相信我不知道这个。
    【解决方案2】:

    我用来解决问题的另一个解决方案是:首先设置值,然后调用PropertyChangedEventArgs,方法是在我的ViewModelBase 中添加一个Set 函数,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2010-10-14
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多