NotifyOfPropertyChange实现

时间:2014-05-29 17:10:42

标签: c# wpf mvvm

如何实现NotifyOnPropertyChange方法?要从继承者ViewModelBase中调用它,可以是:

NotifyOnPropertyChange (() => Property) 

此方法的输入应用lambda表达式,该表达式指定需要通知的更改属性。

3 个答案:

答案 0 :(得分:2)

您可以像这样实现它,因此您根本不必提供属性名称(只要直接从属性setter调用它)。这样,就不用担心重命名属性或拼写错误。

private void NotifyOnPropertyChanged([CallerMemberName] string caller = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(caller));
    }
}

然后,像这样实施你的财产:

string _somePropertyValue;

string SomeProperty
{
    get { return _somePropertyValue; }
    set 
    { 
        if(_somePropertyValue != value)
        {
            _somePropertyValue = value;
            NotifyOnPropertyChanged();
        }
    }
}

答案 1 :(得分:1)

您的实施可能如下所示。它是使用System.Linq.Expressions命名空间实现的。

        protected void RaisePropertyChanged<T>(System.Linq.Expressions.Expression<Func<T>> lambda)
        {
            dynamic l = lambda.Body;
            string propertyName = l.Member.Name;
            OnPropertyChanged(propertyName);
        }

这是全班的一个例子。

    public class NotificationObject : INotifyPropertyChanged
    {
        private string _someProperty;

        public string SomeProperty
        {
            get { return _someProperty; }
            set
            {
                _country = value;
                RaisePropertyChanged(() => SomeProperty);
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }



        protected void RaisePropertyChanged<T>(System.Linq.Expressions.Expression<Func<T>> lambda)
        {
            dynamic l = lambda.Body;
            string propertyName = l.Member.Name;
            OnPropertyChanged(propertyName);
        }
    }

不使用动态的完整实现将如下所示:

        protected void RaisePropertyChanged<T>(System.Linq.Expressions.Expression<Func<T>> lambda)
        {
            if (lambda == null) throw new ArgumentNullException("lambda");

            var memberExpression = lambda.Body as MemberExpression;
            if (memberExpression == null) throw new ArgumentException("Invalid lambda expression.","lambda");

            var property = memberExpression.Member as PropertyInfo;
            if (property == null) throw new ArgumentException("Invalid lambda expression. Expression must be a property.", "lambda");

            // check if the property is not static
            var getMethod = property.GetGetMethod(true);
            if (getMethod.IsStatic) throw new ArgumentException("Invalid lambda expression. Property cannot be static.", "propertyExpression");

            string propertyName = memberExpression.Member.Name;
            OnPropertyChanged(propertyName);
        }

答案 2 :(得分:0)

您可以使用Prism库中的NotificationObject。它已作为RaisePropertyChanged<T>

在那里实施

此处包含指向NotificationObjectPropertySupport类源代码的链接。