2011-10-21 50 views
4

我有一個看起來像這樣的屬性。在沒有添加私有變量的情況下引發propertychanged事件

public int NumberOfElephants { get; set; } 

此屬性在observablecollection中,它必須通知另一個屬性它已更改。

我會怎麼做以下

public int NumberOfElephants { get; set { OnPropertyChanged("totalAnimals"); } 

無碼需要是這樣

private int _numberOfElephants; 
public int NumberOfElephants { 
    get { 
     return _numberOfElephants; 
    } 

    set { 
     _numberOfElephants = value; 
     OnPropertyChanged("totalAnimals"); 
    } 
} 

回答

5

你不知道。你不能。

自動執行屬性只有當屬性很平凡時 - 當超出「返回變量的值」或「設置變量的值」時,get/set不需要代碼。你可以把它與重新格式化,當然更短......我會寫爲:

private int numberOfElephants; 
public int NumberOfElephants { 
    get { return numberOfElephants; } 

    set { 
     _numberOfElephants = value; 
     OnPropertyChanged("totalAnimals"); 
    } 
} 

事實上,我會使用該盤開始「對自己的行左括號」和該物業的開始,但我一直保持你的青睞風格。但是,在單行上使用「單個表達式get/set實現」可以使具有許多屬性的類更清晰。

+0

是有沒有辦法「擴展」 getter和setter方法? –

+0

@JosephLeBrech:只寫完整。兩者之間沒有任何關係。 –

+0

這是一個恥辱,即使像'[Property(「totalAnimals」)]'''''''魔法會很好,我在問這個問題,因爲我還有10個屬性可以做同樣的事情。 –

4

作爲替代Jon的回答,你能得到的工具,將通過IL織做到這一點,如NotifyPropertyWeaver,也可以作爲通過VS Gallery

爲您的樣品的工具,你應該能夠擁有的東西像下面,根據自己的doco on Attributes

[NotifyProperty(AlsoNotifyFor = new[] { "TotalAnimals" })] 
public int NumberOfElephants { get; set; } 

public int TotalAnimals { get; set; } 

然而,根據下面的例子中,從他們的網站它可能不是取決於TotalAnimals實施要求:

代碼

public class Person : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string GivenNames { get; set; } 
    public string FamilyName { get; set; } 

    public string FullName 
    { 
     get 
     { 
      return string.Format("{0} {1}", GivenNames, FamilyName); 
     } 
    } 

} 

什麼被編譯

public class Person : INotifyPropertyChanged { 

    public event PropertyChangedEventHandler PropertyChanged; 

    string givenNames; 
    public string GivenNames 
    { 
     get { return givenNames; } 
     set 
     { 
      if (value != givenNames) 
      { 
       givenNames = value; 
       OnPropertyChanged("GivenNames"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    string familyName; 
    public string FamilyName 
    { 
     get { return familyName; } 
     set 
     { 
      if (value != familyName) 
      { 
       familyName = value; 
       OnPropertyChanged("FamilyName"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    public string FullName 
    { 
     get 
     { 
      return string.Format("{0} {1}", GivenNames, FamilyName); 
     } 
    } 

    public virtual void OnPropertyChanged(string propertyName) 
    { 
     var propertyChanged = PropertyChanged; 
     if (propertyChanged != null) 
     { 
      propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

但我如何使用notifypropertyweaver來告訴屬性'totalAnimals'這個也會發生變化 –

+0

我沒有真正使用它,但是閱讀doco它似乎是可能的(無論是通過約定或顯式屬性)。我會更新答案 – jeffora

1

藉助工具,如PostSharp可以編織創造鍋爐板代碼,代碼的性能。更多,你不必執行INotifyPropertyChanged,PostSharp可以爲你做到這一點。

看到這個blog post

2

通過@jeffora

的答案擴大使用NotifyPropertyWeaver你可以寫這個

public class Animals: INotifyPropertyChanged 
{ 
    public int NumberOfElephants { get; set; } 
    public int NumberOfMonkeys { get; set; } 

    public int TotalAnimals 
    { 
     get 
     { 
      return NumberOfElephants + NumberOfMonkeys; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

,這將是編譯

public class Animals : INotifyPropertyChanged 
{ 
    int numberOfElephants; 
    int numberOfMonkeys; 

    public int NumberOfElephants 
    { 
     get { return numberOfElephants; } 
     set 
     { 
      numberOfElephants = value; 
      OnPropertyChanged("TotalAnimals"); 
      OnPropertyChanged("NumberOfElephants"); 
     } 
    } 

    public int NumberOfMonkeys 
    { 
     get { return numberOfMonkeys; } 
     set 
     { 
      numberOfMonkeys = value; 
      OnPropertyChanged("TotalAnimals"); 
      OnPropertyChanged("NumberOfMonkeys"); 
     } 
    } 


    public int TotalAnimals 
    { 
     get { return NumberOfElephants + NumberOfMonkeys; } 
    } 

    public virtual void OnPropertyChanged(string propertyName) 
    { 
     var propertyChanged = PropertyChanged; 
     if (propertyChanged != null) 
     { 
      propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
相關問題