#17 - Utilizzare le classi con il Binding di WPF

Il Binding è quella funzionalità di WPF che permette di caricare qualsiasi proprietà da una classe in base ad un data source, al contesto di dati o ad un altro elemento. Oltre a mostrare questi valori il motore di Binding è in grado sia di cambiare le proprietà a cui è legato, sia di monitorarle in modo da ripopolare il controllo a cui esso è associato. Per farlo, il motore controlla se la sorgente dati implementa la classe INotifyPropertyChanged del namespace System.ComponentModel e si aggancia all'evento PropertyChanged per ricevere le notifiche di cambiamento delle proprietà. Questa interfaccia è indipendente da WPF ed è già possibile sfruttarla nelle WinForms, perciò è utile se si vuole dare alla propria entità la possibilità di funzionare al meglio anche con WPF.

E' possibile quindi scrivere una classe base che implementi tale interfaccia e fornire dei metodi d'appoggio oltre al pattern event normalmente usato in .NET:

public abstract class NotifyEntity : DispatcherObject, INotifyPropertyChanged
{
private PropertyChangedEventHandler _propertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add { _propertyChanged += value; }
remove { _propertyChanged -= value; }
}

protected virtual void OnPropertyChanged(string propertyName)
{
this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}

protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (_propertyChanged != null)
this._propertyChanged(this, e);
}
}

La classe NotifyEntity può essere poi eredita dalle proprie entità per richiamare l'evento al variare delle proprietà. Ecco un esempio:

public class MyEntity : NotifyEntity
{
private string _property1;

public string Property1
{
get { return _property1; }
set
{
// Controllo se la proprietà è cambiata
if (_property1 != value)
{
_property1 = value;
// Scateno l'evento
OnPropertyChanged("Property1");
}
}
}
}

Per finire poi, nel markup XAML l'uso della proprietà, supponendo di trovarsi già nel contesto di MyEntity è molto banale:

<TextBlock Text="{Binding Property1}" />


Approfondimenti
Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



IN EVIDENZA
MISC