1

新的C#5.0版本中引入的东西在INotifyPropertyChanged的实施摆脱 “魔术字符串”,如:MVVM CallerMemberName和 “神奇字符串”

OnPropertyChanged("CustomerName"); 

现在可以只写:

OnPropertyChanged(); 

它是可能的,因为在CallerMemberName方法定义:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ ... } 

它是米比“魔法字符串”的方式更容易重构,并且比lambda表达式更快,但我不知道我们怎么能从一个set访问器调用多次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我忽视了一些巧妙的方法来处理“魔术字符串”,但是我做了一些研究并没有发现。

+0

为什么你想说的高度已经改变,只是因为宽度有?你真的意味着是像“大小”? – 2013-02-23 10:23:56

+0

这只是一个例子,但有时一个特性可以依赖于其他。例如,如果宽度总是高度* 2。 – Overpain 2013-02-23 11:58:34

回答

4

简单的答案是,你不能那样做。如名称CallerMemberName所示,它将包含调用者的名字。
如果您想为其他人提高PropertyChanged,则必须使用“旧”方法之一。

IDataErrorInfo你也必须使用这些方法之一,没有其他选择。

-1

这将帮助: “一种魔力” 轻松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; } 
    ..... 
} 
+0

-1;这可能是一个不错的工具,但我不认为这是OPs问题的解决方案。如果我错了,请用一些解释来改进你的答案。 – 2013-11-05 12:22:03

1

我知道这个问题是关于C#5.0的,但如果人们仍然有这种性质的问题,请查看c#6.0。 C#6.0有一个很好的方法来解决这个问题。查看关键字的名称。我写了一个小职位有关,如果有人有兴趣:c# 6.0 solves magic strings problem