C# MVVM CallerMemberName和“神奇字符串”

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) { ... } 它比魔术字符串更易于重构

新的C 5.0版本在INotifyPropertyChanged实现中引入了一些东西来消除魔术字符串,如:

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;这也许是一个很好的工具,但我不认为它是解决老年退休金问题的方法。如果我错了,请用一些解释来改进你的答案;这也许是一个很好的工具,但我不认为它是解决老年退休金问题的方法。如果我弄错了,请用一些解释来改进你的答案。