新的C#5.0版本引入了一些在INotifyPropertyChanged实现中摆脱“魔术字符串”的功能,例如:

OnPropertyChanged("CustomerName");

现在可以只写:
OnPropertyChanged();

由于方法定义中的CallerMemberName是可能的:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ ... }

它比“魔术字符串”方式重构友好得多,比lambda表达式更快,但是我想知道如何从一个集合访问器中多次调用OnPropertyChanged。例如,如果我们想要这样的东西:
public int Width
{
    get
    {
        return width;
    }
    set
    {
        width = value;
        OnPropertyChanged("Width");
        OnPropertyChanged("Height");
    }
}

我们如何使用CallerMemberName方法做到这一点,并避免使用“魔术字符串”和lambda表达式?

我也想知道如何避免在IDataError信息中使用“魔术字符串”:
public string Error
        {
            get;
            private set;
        }

        public string this[string columnName]
        {
            get
            {
                if (columnName == "Name")
                {
                    if (String.IsNullOrWhiteSpace(Name))
                        Error = "Name cannot be null or empty.";
                    else
                        Error = null;
                }

                return Error;
            }
        }

我是MVVM的新手,所以也许我忽略了处理“魔力弦”的一些聪明方法,但是我进行了一些研究但没有发现。

最佳答案

简单的答案是,您不能这样做。如名称CallerMemberName所示,它将包含调用方的名称。
对于要为当前版本以外的其他版本提高PropertyChanged的情况,则必须使用“旧”方式之一。

IDataErrorInfo中,您还必须使用其中一种方法,没有其他选择。

关于c# - MVVM CallerMemberName和 “magic strings”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15039415/

10-11 15:59