Комбинированные конвертеры

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

 

Реклама
Tagged with: , , , ,
Опубликовано в Development, Windows 8.1

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: