2014-12-12 20 views
6
ben bu anahtar kelimeyi kullanarak INotifyPropertyChanged uygulayabilirsiniz nasıl bilmek istiyorum 6. C# yeni nameof anahtar kelime hakkında okuyordu

ve nasıl benim MVVM performansını etkileyecek (C# 6 daha tabii diğer) şartları nelerdir uygulama?INotifyPropertyChanged ile sihir dizeleri yerine nasıl kullanılır?

+1

ImplementPropertyChanged özniteliği ile lem, sadece bilirsin. Her ne kadar '' isim '' bunu resmileştirmeli. –

+1

Hayır, bunu hiç bir zaman işaret etmedim. Sadece, bugün çözebileceğin bir şeyi çözmek için henüz piyasaya sürülmemiş bir şeyi bekliyor olman için seni bilgilendiriyordum. Bu soru sadece sizin yararınıza olduğu için * diğer * ziyaretçiler için de yararlıdır. –

+0

Bilgi için teşekkürler. – Mehrad

cevap

9

Bu şuna benzer: Bu çok ölçülebilir olmalı, böylece

public string Foo 
{ 
    get 
    { 
     return this.foo; 
    } 
    set 
    { 
     if (value != this.foo) 
     { 
      this.foo = value; 
      OnPropertyChanged(nameof(Foo)); 
     } 
    } 
} 

nameof(Foo), derleme zamanında "Foo" dizesiyle değiştirilir. Bu yansıma değil.

+0

Hangi '' CallerMemberName '' kullanan diğer mekanizmadan daha * fazla * kod ve ne yazık ki 'infoof' kadar komik değildir. –

+2

'CallerMemberName' yalnızca .NET 4.5'te kullanılabilir. 'Nameof' C# derleyicisiyle birlikte gelir, böylece hala eski .NET çerçevelerini hedefleyebilirsiniz. –

+0

Doğru, bu yararı düşünmemişti. Ama ilginç bir şekilde, 'CallerMemberName' ayrıca bir [derleyici tarafından desteklenen özellik] (http://stackoverflow.com/questions/13381917/is-the-callermembername-attribute-in-4-5-able-to-be-faked) Yani .NET 4.5 bağımlılık dışarı alınabilir. Kodun daha açık ve daha az arayanın perspektifinden gizlenmesinin diğer sebebi için kişisel olarak “nameof” olarak değişebilirim. –

6

Sadece sihirli dizgenin yerine nameof() kullanmanız yeterlidir. Aşağıdaki örnek bu konuda benim blog article itibaren geçerli:

private string currentTime; 

public string CurrentTime 
{ 
    get 
    { 
     return this.currentTime; 
    } 
    set 
    { 
     this.currentTime = value; 
     this.OnPropertyChanged(nameof(CurrentTime)); 
    } 
} 

o evaluated at compile-time olduğundan, (aynı zamanda blog makalesinde açıklanan) geçerli alternatiflerin hepsinden daha fazla performanslısı.

+0

Cevabınız için teşekkürler. Blog girişinizi gerçekten çok beğendim – Mehrad

3

İşte yeni C# 6.0 şekeri kullanarak bir sınıfın tam bir kod örneği verilmiştir: Bununla

public class ServerViewModel : INotifyPropertyChanged { 
    private string _server; 
    public string Server { 
     get { return _server; } 
     set { 
      _server = value; 
      OnPropertyChanged(nameof(Server)); 
     } 
    } 

    private int _port; 
    public int Port { 
     get { return _port; } 
     set { 
      _port = value; 
      OnPropertyChanged(nameof(Port)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) => 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

, siz (nameof() operatörü, boş-şartlı operatörü ?. ve bir ifade gövdeli fonksiyonu olsun OnPropertyChanged tanım).

3

buldum o daha az hatalar ve çok daha temiz kod bir cehennem ile bitirmek olarak PropertyChanged.Fody kullanmak çok daha kolay, bkz - https://github.com/Fody/PropertyChanged

yapmanız gereken tek şey sınıfını yukarıya etiketlemek olduğunu

[ImplementPropertyChanged] 
public class Person 
{   
    public string GivenNames { get; set; } 
    public string FamilyName { get; set; } 

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

Ve yapı sonra o kadar dönüştürülmüştür alır: zaten sihirli dize Soruna alternatifi vardır

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

Fantastik yardımcı.ServiceStack ile veri değiş tokuşu için çok fazla POCO kullanıyorum ve bu onları süper basit (kod olarak) tutmama izin veriyor. – jklemmack

+0

Bu cevap, Fody'nin ne olduğuna dair bir açıklama eklediyseniz daha iyi olurdu. Ayrıca, dönüştürülmüş kodun içinde hala sihirli dizeler vardır, bu OP'nin kaçınmak istediği şeydir. Özelliklerden birinin adı değiştirilirse, Fody dizeleri otomatik olarak da günceller mi? – kmote

+0

Yani fody bir post inşa il dokumacısıdır, bu yüzden kodunuzu oluşturduktan sonra değiştirir ... Sihirli dizeler her yapıdan sonra otomatik olarak güncellenir –

İlgili konular