Die Bindung in Silverlight erfordert ein Source-Objekt oder ein Dependency-Objekt. Von diesem Quellobjekt können Sie an Eigenschaften binden (daher sind Sie per Definition an Instanzmitglieder gebunden) oder an Abhängigkeitseigenschaften.
Da DateTime.Now
eine statische Eigenschaft ist, können Sie nicht direkt in Silverlight an sie binden, daher wird Code benötigt. Die nächste beste Sache ist, den Code zu verwenden, um: -
- sicherzustellen, so viel von dem, was Sie benötigen, können in XAML
- ausgedrückt werden so in einer als entkoppelten Weise wie möglich zu tun.
Daher können wir analysieren, dass wir zwei Dinge brauchen.
- Expose die statischen Elemente der Datumzeit als Beispiel Eigenschaften eines Objekts
- irgendeine Weise die Datumzeit auf eine gewünschte Ausgabe zu formatieren.
Um den ersten Punkt behandeln würde ich erstellen StaticSurrogate
Klasse, wo ich Instanzeigenschaften für die statischen Eigenschaften führen würde, dass wir Zugang müssen: -
public class StaticSurrogate
{
public DateTime Today { get { return DateTime.Today; } }
public DateTime Now { get { return DateTime.Now; } }
}
Jetzt müssen wir einen Weg ein zu formatieren Terminzeit. Ein Wertwandler ist das richtige Werkzeug für diesen Job, Kreditaufnahme stark von dieser Tim Heuer Blog: -
public class FormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter != null)
{
string formatterString = parameter.ToString();
if (!String.IsNullOrEmpty(formatterString))
{
return String.Format(culture, String.Format("{{0:{0}}}", formatterString), value);
}
}
return (value ?? "").ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Mit diesen beiden Klassen an Ort und Stelle können wir jetzt tun, den Rest in XAML, zuerst müssen wir Instanzen dieser Klassen in unserer Ressourcen : -:
<TextBlock Text="{Binding Today, Source={StaticResource Static},
Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" />
Beachten Sie, dass dieser Ansatz hat folgende Vorteile: - -
<UserControl.Resources>
<local:StaticSurrogate x:Key="Static" />
<local:FormatConverter x:Key="Formatter" />
</UserControl.Resources>
Jetzt können wir die TextBlock
verdrahten
Wir müssen dem UserControl, auf dem der TextBlock platziert ist, keinen Code hinzufügen, und wir müssen auch nicht mit irgendeinem Datenkontext herumspielen.
Die statischen Ressourcen können in App.Resources platziert werden, wodurch die Erstellung des TextBlocks völlig unabhängig von der Notwendigkeit ist, dem Benutzersteuerelement weitere Elemente hinzuzufügen.
Die Formatierung zur Anzeige des Datums kann unabhängig voneinander geändert werden.
Der Zugriff auf zusätzliche statische Eigenschaften kann problemlos zur Klasse StaticSurrogate
hinzugefügt werden.
Das macht Sinn für mich, aber es ist extrem scheint im Vergleich zu der Flex-Syntax: text = "{new Date()}". Ich denke, das alles läuft darauf hinaus, dass Silverlight nur einige Markup-Erweiterungen in XAML unterstützt. Es wäre schön, wenn sie die Bewertung der geschweiften Klammer robuster machen würden. Danke für Ihre Hilfe! –