如何实现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

如何实现IDataErrorInfo与lambda版本的RaisePropertyChanged在MVVM光

您可以通过类似的方式获得属性名

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)
{
    ...
}