SORU
22 AĞUSTOS 2009, CUMARTESİ


Uygulama INotifyPropertyChanged - daha iyi bir yolu var mı?

Microsoft INotifyPropertyChanged otomatik özellikleri gibi, sadece {get; set; notify;}belirtmek için bir şeyler çabuk hayata geçirdik gerekir Mantıklı bir sürü yapmak olduğunu düşünüyorum. Ya da bunu yapmak için herhangi bir komplikasyon var mı?

Kendimizi 'bildir' bizim özellikleri. gibi bir hale getirebiliriz Uygulama için zarif bir çözüm varINotifyPropertyChangedsınıf ya da yapmanın tek yolu her özelliği PropertyChanged olay yükselterek.

Otomatik oluşturmak kod parçası için bir şeyler yazmak PropertyChanged olayı başlatmak için alabilir miyiz?

CEVAP
22 AĞUSTOS 2009, CUMARTESİ


Postsharp gibi bir şey kullanmadan, kullandığım minimal versiyonu gibi bir şey kullanır:

public class Data : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    // props
    private string name;
    public string Name
    {
        get { return name; }
        set { SetField(ref name, value, "Name"); }
    }
}

Her özelliği gibi bir şey

    private string name;
    public string Name
    {
        get { return name; }
        set { SetField(ref name, value, "Name"); }
    }

büyük; ayrıca eğer isterseniz taban sınıf olarak kullanılabilir değil. SetField bool geri dönerse diğer mantık geçerli olmak istersin diye no-op olsaydı, size söyler.


hatta daha kolay C# 5:

protected bool SetField<T>(ref T field, T value,
    [CallerMemberName] string propertyName = null)
{...}

ve:

set { SetField(ref name, value); }

hangi derleyici "Name" otomatik olarak ekleyecektir.


C# 6.0 uygulanması daha kolay hale getirir:

protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • dougownsall

    dougownsall

    7 EKİM 2007
  • Google Chrome

    Google Chrom

    1 EYLÜL 2008