This article has been localized into German by the community.
Die StringFormat Eigenschaft
Wie wir im vorherigen Kapitel gesehen haben, verändert man die Ausgabe, normalerweise durch die Verwendung von Konvertern. Das Coole daran ist, dass die Konverter jeden Datentypen in einen komplett anderen verändern können. In einfachen Fällen, bei denen man nur das Erscheinungsbild ändern und nicht in einen anderen Datentyp konvertieren will, kann auch auch die StringFormat Eigenschaft ausreichen.
Wenn Sie die StringFormat-Eigenschaft einer Bindung verwenden, verlieren Sie etwas von der Flexibilität, die Sie bei der Verwendung eines Konverters erhalten, aber im Gegenzug ist sie viel einfacher zu verwenden und man braucht keine neue Klasse zu erstellen.
Die StringFormat-Eigenschaft tut genau das, was der Name sagt: Sie formatiert den Ausgabestring, indem sie einfach die Methode String.Format aufruft. Manchmal sagt ein Beispiel mehr als tausend Worte, also lassen Sie uns direkt in ein Beispiel springen, bevor mein Text hier tausend Wörter lang wird:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<StackPanel Margin="10">
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat=Window width: {0:#,#.0}}" />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualHeight, StringFormat=Window height: {0:C}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
</StackPanel>
</Window>
Die ersten beiden TextBlocks erhalten ihren Wert, indem sie sich an das übergeordnete Fenster binden und dessen Breite und Höhe ermitteln. Über die StringFormat-Eigenschaft werden die Werte formatiert. Für die Breite geben wir einen benutzerdefinierten Formatierungsstring an und für die Höhe nehmen wir das Währungsformat, nur zum Spaß. Der Wert wird als double-Typ gespeichert, so dass wir die gleichen Formatangaben verwenden können, als ob wir double.ToString() aufgerufen hätten. Eine Liste finden Sie hier: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Beachten Sie auch, wie ich benutzerdefinierten Text in das StringFormat einfügen kann - so können Sie eigenen Text nach Belieben dem den gebundenen Wert voranstellen oder anhängen. Wenn wir den aktuellen Wert innerhalb des Formatstrings referenzieren, umgeben wir ihn mit Paaren geschweifter Klammern, die zwei Werte enthalten: Eine Referenz auf den zu formatierenden Wert (Wert Nummer 0, was der erste mögliche Wert ist) und den Formatstring, getrennt durch einen Doppelpunkt.
Für die letzten zwei Werte verbinden wir mit unserem selbsterstellten Format einfach die aktuellen Daten (DateTime.Now) mit der Ausgabe des Datums und der Zeit (in Stunden und Minuten). Mehr über das Formatieren des DateTime können Sie hier nachlesen: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx
Formatierung ohne zusätzlichen Text
Bitte beachten Sie: Wenn Sie einen Formatstring angeben, der keinen benutzerdefinierten Text enthält, was bei allen obigen Beispielen der Fall ist, dann müssen Sie bei der Definition in XAML einen zusätzlichen Satz geschweifter Klammern hinzufügen. Der Grund dafür ist, dass WPF ansonsten die Syntax mit der für Markup Extensions verwendeten verwechselt. Hier ist ein Beispiel:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<WrapPanel Margin="10">
<TextBlock Text="Width: " />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat={}{0:#,#.0}}" />
</WrapPanel>
</Window>
Eine bestimmte Culture verwenden
Wenn Sie einen gebundenen Wert entsprechend einer bestimmten Kultur ausgeben müssen, ist das kein Problem. Das Binding verwendet die für das übergeordnete Element angegebene Sprache oder Sie können es direkt für das Binding mit der ConverterCulture-Eigenschaft angeben. Hier ist ein Beispiel:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatCultureSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatCultureSample" Height="120" Width="300">
<StackPanel Margin="10">
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
</StackPanel>
</Window>
Es ist ziemlich einfach: Durch die Kombination der StringFormat-Eigenschaft, die die D-Spezifikation (Lange Datumsformatierung) und die ConverterCulture-Eigenschaft verwendet, können wir die gebundenen Werte entsprechend einer bestimmten Kultur ausgeben. Ziemlich schick!