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 varINotifyPropertyChanged
sı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
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));
}
5 yıldızlı reytinge göre sıralamak içi...
Benim en Raylar için özel yapılandırma...
Yerel Ağ Uygulama Sunucusu GAE dev eri...
Bir dosyanın önceki bir SVN revizyon i...
Nil ya da Uzunluğu Kontrol Ruby bir Di...