新的 C# 5.0 版本引入了一些东西来摆脱 INotifyPropertyChanged 实现中的"魔术字符串",例如:
OnPropertyChanged("CustomerName");
现在可以只写:
OnPropertyChanged();
由于方法定义中的调用者成员名称,这是可能的:
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# 5.0 的,但如果人们仍然有这方面的问题,请查看 C# 6.0。C# 6.0 有一个很好的方法来解决这个问题。查看关键字的名称。如果有人感兴趣,我写了一篇关于它的小文章:c# 6.0 解决了魔术字符串问题
这将有助于:"有点魔法"毫不费力地改变财产
http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a
作为将其添加到一个属性的示例:
[Magic]
public string Name { get { return _name; } set { _name = value; } }
string _name;
将其添加到所有类属性的另一个示例:
[Magic]
public class MyViewModel: INotifyPropertyChanged
{
public string Name { get; set; }
public string LastName { get; set; }
.....
}