propertychangedeventargs property onpropertychanged ejemplo change c# .net .net-3.5 inotifypropertychanged automatic-properties

c# - onpropertychanged - ¿Cuál es la mejor manera de llamar al evento PropertyChanged de INotifyPropertyChanged?



property change wpf (2)

Lo que hago por ahora es que escribo esto en mi clase:

//AUTOGENERATE INotifyProperty private bool myfield;

Y escribí una pequeña herramienta que genera todo el código de propiedad necesario en una clase parcial. Esto de ninguna manera es una solución elegante, pero funciona :)

Cuando implementa la interfaz INotifyPropertyChanged, usted es responsable de llamar al evento PropertyChanged cada vez que se actualiza una propiedad en la clase.

Esto generalmente conduce al siguiente código:

public class MyClass: INotifyPropertyChanged private bool myfield; public bool MyField { get { return myfield; } set { if (myfield == value) return; myfield = value; OnPropertyChanged(new PropertyChangedEventArgs("MyField")); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler h = PropertyChanged; if (h != null) h(this, e); } }

Eso es 12 líneas por propiedad.

Sería mucho más simple si uno pudiera decorar propiedades automáticas como esta:

[INotifyProperty] public double MyField{ get; set; }

Pero desafortunadamente esto no es posible (ver esta publicación en msdn por ejemplo)

¿Cómo puedo reducir la cantidad de código necesario por propiedad?


En realidad, son solo 3-4 líneas por propiedad ; las otras líneas se amortizan sobre todas las propiedades de "notificación":

class Person : INotifyPropertyChanged { #region INotifyPropertyChanged: Shared bit public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } #endregion private string _firstName; public string FirstName { get { return _firstName; } set { if (_firstName == value) return; _firstName = value; OnPropertyChanged(new PropertyChangedEventArgs("FirstName")); } } // Ditto for other properties }

Podría intentar algo como lo siguiente, que comparte algo más de la carga:

private string _firstName; public string FirstName { get { return _firstName; } set { SetNotifyingProperty("FirstName", ref _firstName, value); } } private void SetNotifyingProperty<T>(string propertyName, ref T field, T value) { if (value.Equals(field)) return; field = value; OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); }