繁体   English   中英

MVVM CallerMemberName和“魔术字符串”

[英]MVVM CallerMemberName and “magic strings”

新的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#5.0的,但是如果人们仍然对这个性质有疑问,请查看c#6.0。 C#6.0有很好的方法来解决这个问题。 查看nameof关键字。 如果有人有兴趣,我写了一篇关于它的帖子: c#6.0解决了魔术字符串问题

这将有助于:“种类的魔法”轻松的INotifyPropertyChanged

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; } 
  ..... 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM