C# MVVM CallerMemberName和“神奇字符串”
新的C 5.0版本在INotifyPropertyChanged实现中引入了一些东西来消除魔术字符串,如:C# MVVM CallerMemberName和“神奇字符串”,c#,mvvm,inotifypropertychanged,idataerrorinfo,callermembername,C#,Mvvm,Inotifypropertychanged,Idataerrorinfo,Callermembername,新的C 5.0版本在INotifyPropertyChanged实现中引入了一些东西来消除魔术字符串,如: OnPropertyChanged("CustomerName"); 现在可以只写: OnPropertyChanged(); 可能是由于方法定义中的CallerMemberName: protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { ... } 它比魔术字符串更易于重构
OnPropertyChanged("CustomerName");
现在可以只写:
OnPropertyChanged();
可能是由于方法定义中的CallerMemberName:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ ... }
它比魔术字符串更易于重构,比lambda表达式更快,但我想知道如何从一个集合访问器多次调用PropertyChanged。例如,如果我们想要这样的东西:
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中,您还必须使用其中一种方法,别无选择。简单的答案是,您不能这样做。正如名称CallerMemberName所示,它将包含调用者的名称。 对于您希望为当前以外的其他项目筹集PropertyChanged的情况,您必须使用旧方法之一 在IDataErrorInfo中,您还必须使用其中一种方法,没有其他选择。这将有助于: 一种魔力 不费吹灰之力改变了性能 作为将其添加到一个属性的示例:
[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; }
.....
}
这将有助于:
一种魔力
不费吹灰之力改变了性能
作为将其添加到一个属性的示例:
[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; }
.....
}
我知道这个问题是关于C 5.0的,但是如果人们仍然有这种性质的问题,请查看C 6.0。C 6.0有一个很好的方法来解决这个问题。检查关键字的名称。如果有人感兴趣,我写了一篇关于它的帖子:我知道这个问题是关于C5.0的,但是如果人们仍然有这种性质的问题,请查看C6.0。C 6.0有一个很好的方法来解决这个问题。检查关键字的名称。如果有人感兴趣的话,我写了一篇关于它的帖子:为什么你想说因为宽度改变了,所以高度改变了?你真的想让它像大小一样吗?这只是一个例子,但有时一个属性可能依赖于另一个。例如,如果“宽度”始终为“高度”*2,为什么要说“高度”已更改只是因为“宽度”已更改?你真的想让它像大小一样吗?这只是一个例子,但有时一个属性可能依赖于另一个。例如,如果宽度始终为高度*2.-1;这也许是一个很好的工具,但我不认为它是解决老年退休金问题的方法。如果我错了,请用一些解释来改进你的答案;这也许是一个很好的工具,但我不认为它是解决老年退休金问题的方法。如果我弄错了,请用一些解释来改进你的答案。