This article is currently in the process of being translated into Bulgarian (~94% done).
StringFormat свойството
Както видяхме в предишните глави, начинът за манипулиране на изхода чрез обвързване, преди то да бъде показано, обикновено минава през използването на конвертор. Хубавото при тези конвертори е, че ви позволяват да конвертирате всеки тип данни в напълно различен тип данни. Въпреки това, за по-прости сценарии, където просто искате да промените начина, по който се показва определена стойност и не е задължително да я конвертирате в различен тип, свойството StringFormat може да е достатъчно.
Използвайки свойството StringFormat при обвързване, вие губите част от гъвкавостта, която получавате, когато използвате конвертор, но в замяна е много по-лесно използването му и не включва създаването на нов клас в нов файл.
Свойството StringFormat прави точно това, което подсказва името му - форматира изходния низ, просто като извиква метода String.Format. Понякога един пример казва повече от хиляда думи, така че преди да достигна този брой думи, нека преминем направо към примера:
<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>
Първата двойка TextBlock получава стойността си чрез обвързване към родителския прозорец (използвайки името му "wnd") и получаване на неговата ширина и височина. Чрез свойството StringFormat стойностите се форматират. За ширината указваме персонализиран форматиращ низ, а за височината го молим да използва валутния формат, просто за забавление. Стойността се записва като double тип, така че можем да използваме същите спецификатори на формат, както ако бяхме извикали double.ToString(). Можете да намерите списък с тях тук: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Също така забележете как мога да включа персонализиран текст в StringFormat - това ви позволява да фиксирате предварително/след това обвързаната стойност с текст, по начина по който желаете. Когато препращаме към действителната стойност вътре в низа за форматиране, ние я обграждаме с набор от фигурни скоби, който включва две стойности: препратка към стойността, която искаме да форматираме (стойност номер 0, която е първата възможна стойност) и низът за форматиране, разделени с двоеточие.
За последните две стойности ние просто се свързваме с текущата дата (DateTime.Now) и я извеждаме първо като дата, в специфичен формат, а след това като час (часове и минути), отново използвайки нашите собствени, предварително определен формати. Можете да прочетете повече за форматирането на DateTime тук: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx
Форматиране без допълнителен текст
Моля, имайте предвид, че ако зададете форматиращ низ, който не включва персонализиран текст, като в случая на всички примери по-горе, тогава трябва да добавите допълнителен набор фигурни скоби, когато го дефинирате в XAML. Причината е, че в противен случай WPF може да обърка синтаксиса с този, използван за Markup Extensions. Ето един пример:
<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>
Използване на специфични Регионални настройки (Culture)
В случай че трябва да изведете обвързана стойност в съответствие с конкретни регионални настройки, това не е проблем. Binding ще използва езика, дефиниран за родителския елемент, или можете да го посочите директно при обвързването, като използвате свойството ConverterCulture. Ето един пример:
<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>
Доста е просто: чрез комбиниране на свойството StringFormat, което използва D спецификатора (Long date pattern) и свойството ConverterCulture, можем да изведем обвързаните стойности в съответствие с конкретните регионални настройки.