TOC

This article has been localized into Czech by the community.

Datové vazby (Data binding):

Vlastnost StringFormat

Jak jsme viděli v předchozích kapitolách, způsob, jak manipulovat s výstupem vazby před jejím zobrazením, je typicky prostřednictvím použití konvertoru. Skvělá věc na konvertorech je, že umožňují převést jakýkoli datový typ na úplně jiný datový typ. Nicméně, pro jednodušší scénáře použití, kdy chcete pouze změnit způsob zobrazení určité hodnoty a není nutně potřeba ji převádět na jiný typ, může být vlastnost StringFormat více než dostatečná.

Použitím vlastnosti StringFormat vazby ztratíte některou flexibilitu, kterou získáváte při použití konvertoru, ale na oplátku je její použití mnohem jednodušší a nevyžaduje vytvoření nové třídy v novém souboru.

Vlastnost StringFormat dělá přesně to, co název napovídá: Formátuje výstupní řetězec jednoduše voláním metody String.Format. Někdy příklad řekne více než tisíc slov, takže než dosáhnu této délky textu, pojďme se rovnou ponořit do příkladu:

<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>

První dva TextBlocky získávají svou hodnotu vazbou na nadřazené okno a získáváním jeho šířky a výšky. Prostřednictvím vlastnosti StringFormat jsou hodnoty formátovány. Pro šířku specifikujeme vlastní formátovací řetězec a pro výšku požadujeme použití měnového formátu, jen pro zábavu. Hodnota je uložena jako typ double, takže můžeme použít všechny stejné formátovací specifikátory, jako bychom volali double.ToString(). Seznam těchto specifikátorů najdete zde: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Všimněte si také, jak mohu do StringFormatu zahrnout vlastní text - to vám umožňuje podle libosti přidávat text před nebo za vázanou hodnotu. Když odkazujeme na skutečnou hodnotu uvnitř formátovacího řetězce, obklopíme ji sadou složených závorek, která obsahuje dvě hodnoty: odkaz na hodnotu, kterou chceme formátovat (hodnota číslo 0, což je první možná hodnota) a formátovací řetězec, oddělené dvojtečkou.

Poslední dvě hodnoty jednoduše vážeme k aktuálnímu datu (DateTime.Now) a zobrazíme ho nejprve jako datum, ve specifickém formátu, a poté jako čas (hodiny a minuty), opět používáme náš vlastní, předem definovaný formát. Více informací o formátování DateTime najdete zde: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

Formátování bez dodatečného textu

Mějte na paměti, že pokud specifikujete formátovací řetězec, který neobsahuje žádný vlastní text, což dělají všechny výše uvedené příklady, pak je potřeba při definování v XAML přidat další sadu složených závorek. Důvodem je, že WPF by jinak mohlo syntaxi zaměnit za tu, která se používá pro Markup Extensions. Zde je příklad:

<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>

Použití konkrétní kultury

Pokud potřebujete vypsat vázanou hodnotu v souladu s konkrétní kulturou, není problém. Vazba použije jazyk specifikovaný pro nadřazený prvek, nebo můžete jazyk přímo specifikovat pro vazbu pomocí vlastnosti ConverterCulture. Zde je příklad:

<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>

Je to docela jednoduché: Kombinací vlastnosti StringFormat, která využívá specifikátor D (vzor dlouhého data) a vlastnosti ConverterCulture, můžeme vypsat vázané hodnoty v souladu s konkrétní kulturou. Docela šikovné!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!