如何实现NotifyOnPropertyChange方法?要从继承者ViewModelBase中调用它,可以是:
NotifyOnPropertyChange (() => Property)
此方法的输入应用lambda表达式,该表达式指定需要通知的更改属性。
答案 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>
此处包含指向NotificationObject
和PropertySupport
类源代码的链接。