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));
}