This article has been localized into Polish by the community.
Właściwość StringFormat
Jak zobaczyliśmy w poprzednich rozdziałach, przyjętym sposobem operowania powiązanymi danymi wyjściowymi przed ich wyświetleniem jest posługiwanie się konwerterem. Zaletą konwerterów jest możliwość zamiany dowolnego typu danych na zupełnie inny typ. W prostszych sytuacjach, jeśli chcesz wyłącznie zmienić sposób wyświetlania określonej wartości i niekoniecznie przekonwertować ją na inny typ, wystarczające może okazać się użycie właściwości StringFormat .
Używając do powiązań właściwości StringFormat traci się nieco na możliwościach uzyskiwanych dzięki użyciu konwertera. Ten sposób jest jednak znacznie prostszy w użyciu i nie wymaga tworzenia nowej klasy w oddzielnym pliku.
Właściwość StringFormat robi dokładnie to, na co wskazuje jej nazwa: Formatuje wyjściowy łańcuch znaków, po prostu wywołując metodę String.Format. Czasami przykład mówi więcej niż tysiąc słów, stąd najlepiej od razu przejść do przykładu:
<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>
Pierwsza para elementów typu TextBlock pobiera szerokość i wysokość nadrzędnego okna. Wartości te zostają sformatowane za pomocą właściwości StringFormat. W przypadku szerokości (width) używany jest łańcuch formatujący, natomiast wysokość (height) wyświetlana jest (dla żartów) w formacie walutowym. Obydwie wartości zapisywane są z użyciem liczb zmiennopozycyjnych typu double, stąd do ich zapisu można było użyć tych samych znaków formatujących jakich używa się przy wywołaniu metody double.ToString (). Lista znaków formatujących dostępna jest pod adresem: http://msdn.microsoft.com/en-us/library /dwhawy9k.aspx
Warto zwrócić uwagę na to w jaki sposób używając StringFormat można dołączyć dowolny tekst. W razie potrzeby, przed lub po wyświetlanej wartości (powiązanej), można wstawić taki tekst. Przy odwoływaniu się do powiązanej wartości zapisanej wewnątrz łańcucha formatującego umieszczamy ją w nawiasach klamrowych zawierających dwie wielkości oddzielone dwukropkiem: numer wskazujący wartość (0 wskazuje pierwszą wartość) i ciąg formatujący.
Dwie ostatnie wartości wynikają z ich powiązania z bieżącą datą (DateTime.Now). Pierwsza wyprowadzana jest jako data, w zdefiniowanym formacie, a kolejna jako czas (godziny i minuty), ponownie używając własnego formatu. O zasadach formatowania daty i czasu (właściwości DateTime) można przeczytać pod adresem: http://msdn.microsoft.com/en-us/library /az4se3k1.aspx
Formatowanie bez dodatkowego tekstu
Należy pamiętać, że jeśli ciąg formatujący nie zawiera żadnego niestandardowego tekstu (inaczej jak w we wszystkich powyższych przykładach) to podczas definiowania go w XAML konieczne jest użycie dodatkowego zestawu nawiasów klamrowych. W innym przypadku WPF może niewłaściwie zinterpretować składnię i pomylić z innym zapisem używanym w XAML. Oto przykład:
<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>
Stosowanie ustawień regionalnych
Powiązana wartość może być bezproblemowo wyprowadzana z dostosowaniem do właściwego systemu lokalnego. Do powiązania stosowany jest język określony dla elementu nadrzędnego lub może on zostać bezpośrednio zadeklarowany dla konkretnego powiązania, przez użycie właściwości ConverterCulture. Oto przykład:
<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>
Uzyskanie takiego efektu jest proste dzięki połączeniu właściwości StringFormat (z użyciem specyfikatora D oznaczającego wzorzec długiej daty) i właściwości ConverterCulture. W ten sposób możemy wyprowadzać powiązane wartości zgodnie z określoną kulturą. Całkiem fajne!