如何实现IDataErrorInfo与lambda版本的RaisePropertyChanged在MVVM光
本文关键字:版本 RaisePropertyChanged MVVM lambda 何实现 实现 IDataErrorInfo | 更新日期: 2023-09-27 18:04:12
之前我有:
const string FooPropertyName = "Foo";
我在做:
RaisePropertyChanged(FooPropertyName);
我还像这样实现了IDataErrorInfo
接口:
public string this[string columnName]
{
get
{
switch(columnName)
{
case FooPropertyName:
return CheckFoo();
default: return null;
}
}
}
现在我想切换到lambda语法并省略字符串常量,
RaisePropertyChanged(() => Foo);
如何实现IDataErrorInfo
您可以通过类似的方式获得属性名
protected string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
var memberExpr = propertyExpression.Body as MemberExpression;
if (memberExpr == null) throw new ArgumentException("propertyExpression should represent access to a member");
return memberExpr.Member.Name;
}
然后像这样使用
if (columnName == GetPropertyName<MyClass>(() => Foo))
return CheckFoo();
我以前没有使用过MVVM Light,所以这更适合于信息目的而不是答案,但我确实知道,为了不为INotifyPropertyChanged.PropertyChanged
事件提供属性名称,您需要使用CallerMemberNameAttribute
类。根据链接页面,这个
允许获取方法
调用方的方法名或属性名
然而,这个属性只在。net 4.5中添加,所以如果你不使用这个版本,那么你将无法使用它。
它应该在你想要自动提供成员名给…的输入参数之前使用。在您的情况下,在RaisePropertyChanged
方法中:
public override void RaisePropertyChanged([CallerMemberName] string propertyName)
{
...
}