Bernhard  GrojerDataBinding in WPF/Silverlight – Refresh ohne Code im UI - INotifyPropertyChanged



Unter WPF und Silverlight ist DataBinding ein leichtes geworden. Wie funktionierts?

Mithilfe der Klasse (Binding) kann man sowohl im XAML Code als auch via Programmlogik ein DataBinding erstellen:
<TextBlock Text="{Binding Path=MYPATH, Source=MYSOURCE" />

MYPATH muss dabei ein Property sein, gegen das man binden möchte (zB die Value-Eigenschaft eines Sliders).
MYSOURCE hingegen ein Quelle (zB eine Instanz des Sliders)

Doch wir hätten diesmal gerne eine Uhrzeit im Userinterface (oder irgend einen anderen Wert aus der Programm-Logik).
Auch das ist in Silverlight/WPF kein Problem und umfasst 3 Schritte.

1) Unsere Datenquelle (Klasse) umsetzen und INotifyPropertyChanged implementieren
2) Eine Instanz der Klasse in den Ressourcen ablegen.
3) DataBinding zwischen der Resource und dem UI-Element erstellen

1) Die Klasse umsetzen:

public class RefreshingClock : INotifyPropertyChanged
    {
        DispatcherTimer dt;

        public RefreshingClock()
        {
            dt = new DispatcherTimer();
            dt.Interval = TimeSpan.FromSeconds(1);
            dt.Tick += dt_Tick;
            dt.Start();
        }

        void dt_Tick(object sender, EventArgs e)
        {
            if (this.PropertyChanged != null)            
                this.PropertyChanged(this, new PropertyChangedEventArgs("CurrentTime"));
            
        }

        public DateTime CurrentTime
        {
            get
            {
                return DateTime.Now;
            }

        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }

Hier ist eigentlich lediglich wichtig, dass wir immer, bei Änderungen d. Property “CurrentTime” unser INotifyPropertyChanged Event triggern müssen.
Siliverlight/WPF Bindings konsumieren hierbei dieses Event und werden Somit über die Änderung informiert.

2) Eine Instanz der Klasse bilden:

<UserControl.Resources>
        <local:RefreshingClock x:Key="Clock" />
</UserControl.Resources>

3) Das DataBinding:

<TextBlock Text="{Binding Path=CurrentTime, Source={StaticResource Clock}}" />

Und somit haben wir 0 Zeilen Programmcode im eigentlichen UI.

Das Ergebnis:
image 

Code zum Downloden gibt es hier.



Kategorien: 09.10.2008 14:11:11


 


Neuen Kommentar einfügen:

  Titel:   
  Name:
  E-Mail:
  Kommentar:

 
 


Kommentare




© Copyright 2008 ppedv AG