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