Utilizzare le classi con il Binding di WPF

di Cristian Civera, in Windows Presentation Foundation, XAML,

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}" />

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi