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:
Code zum Downloden gibt es hier.