如何在MVVM Light中使用lambda版本的RaisePropertyChanged实现IDataErrorInfo?

时间:2014-05-19 08:49:44

标签: c# wpf mvvm viewmodel mvvm-light

早些时候我曾:

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

2 个答案:

答案 0 :(得分:2)

您可以以类似的方式获取属性名称

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

答案 1 :(得分:0)

之前我没有使用MVVM Light,所以这更多是为了提供信息而不是答案,但我知道为了为{{1}提供属性名称} event,您需要使用CallerMemberNameAttribute Class。根据链接页面,这个

  

允许您获取方法

的调用者的方法或属性名称

但是,此属性仅在.NET 4.5中添加,因此如果您不使用此版本,那么您将无法使用它。

它应该在您要自动提供成员名称的输入参数之前使用...在您的情况下,在INotifyPropertyChanged.PropertyChanged方法中:

RaisePropertyChanged