XAML — это декларативный язык и наиболее мощное средство привязки данных. В нем можно установить конвертер (далее преобразователь) на любую привязку данных (binding). Вы можете использовать данную возможность, когда вам необходимо отобразить данные в формате, отличного от хранимого. Но, к сожалению, можно установить только один конвертер. Так что если вам, например, необходимо преобразовать дату, используя FormatConverter и конвертировать результат в верхний регистр, используя UppercaseConverter — вы застряли. Для решения этой проблемы я создал класс ValueConverterGroup. Это конвертер, который содержит несколько преобразователей — список объектов IValueConverter с реализацией интерфейса IValueConverter. Метод Convert() группированного преобразователя вызывает метод Convert() всех “внутренних” преобразователей. Я не реализовывал метод ConvertBack(), т.к. в моем случае в нем нет необходимости.
ValueConverterGroup
using System; using System.Collections.Generic; using System.Linq; using Windows.UI.Xaml; using Windows.UI.Xaml.Data; namespace ReflectionIT.Windows8.Converters { public class ValueConverterGroup : List<IValueConverter>, IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { return this.Aggregate(value, (current, converter) => current == DependencyProperty.UnsetValue ? current : converter.Convert(current, targetType, parameter, language)); } public object ConvertBack(object value, Type targetType, object parameter, string language) { System.Diagnostics.Debugger.Break(); // Not Implemented throw new NotImplementedException(); } } }
Пример использования
Следующий пример содержит в себе элемент управления DatePicker и два элемента TextBlock. Первый (красный) TextBlock использует FormatConverter для преобразования даты в формат dd-MMM-yyyy. Второй (синий) TextBlock использует мой ValueConverterGroup для совмещения FormatConverter и UppercaseConverter.
<Page x:Class="ConvertersDemo.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ConvertersDemo" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:c="using:ReflectionIT.Windows8.Converters" mc:Ignorable="d"> <Page.Resources> <c:FormatConverter x:Key="DateFormat" FormatString="{}{0:dd-MMM-yyyy}" /> <c:ValueConverterGroup x:Key="UppercaseDateFormat"> <c:FormatConverter FormatString="{}{0:dd-MMM-yyyy}" /> <c:UppercaseConverter /> </c:ValueConverterGroup> </Page.Resources> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <DatePicker x:Name="datePicker" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="136,85,0,0" /> <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Date, Converter={StaticResource DateFormat}, ElementName=datePicker}" VerticalAlignment="Top" Margin="136,164,0,0" FontSize="64" Foreground="Red" /> <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Date, Converter={StaticResource UppercaseDateFormat}, ElementName=datePicker}" VerticalAlignment="Top" Margin="136,283,0,0" FontSize="64" Foreground="Blue" /> </Grid> </Page>
Как вы можете видеть на следующей картинке синий TextBlock показывает дату в формате dd-MMM-yyyy и что самое важное — в верхнем регистре.
Ниже представлен код используемых конвертеров
FormatConverter
using System; using System.Globalization; using Windows.UI.Xaml.Data; namespace ReflectionIT.Windows8.Converters { public class FormatConverter : IValueConverter { public string FormatString { get; set; } public object Convert(object value, Type typeName, object parameter, string language) { string formatterString = (parameter as String) ?? FormatString; if (!string.IsNullOrEmpty(formatterString)) { return string.Format(formatterString, value); } return System.Convert.ToString(value); } public object ConvertBack(object value, Type typeName, object parameter, string language) { System.Diagnostics.Debugger.Break(); // Not Implemented throw new NotImplementedException(); } } }
UppercaseConverter
using System; using Windows.UI.Xaml.Data; namespace ReflectionIT.Windows8.Converters { class UppercaseConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { return System.Convert.ToString(value).ToUpper(); } public object ConvertBack(object value, Type targetType, object parameter, string language) { System.Diagnostics.Debugger.Break(); // Not Implemented throw new NotImplementedException(); } } }
Ссылка на источник: Windows 8 XAML Tips — Combining Converters
Добавить комментарий