Интерфейс IValueConverter

В моей первой публикации по Silverlight я отображал столбец даты рождения в элементе управления DataGrid Silverlight 3.0. Как можно видеть, я использовал это изображение и здесь. На следующем рисунке можно видеть, что в столбце даты рождения также отображается и время, что плохо, поскольку в имени столбца говорится о дате, а не о времени. Поэтому для отображения в этом столбце только даты я использовал интерфейс IValueConverter, который применяется для отображения даты без времени.

IValueConverter

Если требуется сопоставить преобразователь значений с привязкой, создайте класс, реализующий интерфейс IValueConverter, а затем реализуйте методы Convert и ConvertBack. Преобразователи могут изменять один тип данных на другой, переводить данные на основе сведений о языке и региональных параметрах, а также изменять другие аспекты представления. Примеры некоторых типичных сценариев см. в разделе "Преобразование данных" статьи, посвященной обзору привязок данных ("Data Binding Overview").

Преобразователи значений учитывают язык и региональные параметры. Методы Convert и ConvertBack имеют параметр culture, который указывает сведения о языке и региональных параметрах. Если язык и региональные параметры не имеют отношения к преобразованию, то в настраиваемом преобразователе этот параметр можно игнорировать.

В методах Convert и ConvertBack имеется также параметр с именем parameter, поэтому можно использовать один и тот же экземпляр преобразователя с разными параметрами. Например, можно написать параметр форматирования, который создает разные параметры данных в зависимости от используемого входного параметра. Можно использовать ConverterParameter класса Binding для передачи параметра в качестве аргумента в методы Convert и ConvertBack (источник).

Чтобы достичь цели отображения в столбце даты рождения только даты без времени, при привязке столбца даты рождения я создал класс, который используется для возврата только даты. Далее приводится код моего класса преобразования даты, в котором я реализовал функцию преобразования, но не функцию ConvertBack.

public class ShowDatePart : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime dtpDate = DateTime.Now;
dtpDate = (DateTime)value;
return dtpDate.ToString("dd/MM/yyyy");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}

Ниже приводится код xaml для включения пространства имен, в котором размещен мой преобразователь даты:

xmlns:local="clr-namespace:SilverLight_Converter"

В следующем примере local сопоставляется с пространством имен, в котором задан преобразователь DateConverter, и я установил здесь имя преобразователя DisplayDate. Поэтому везде, где мне потребуется использовать этот преобразователь в коде xaml, я могу использовать это имя статического ресурса.

< UserControl.Resources  >
 < local:ShowDatePart x:Key="DisplayDate"/ >
</UserControl.Resources>

Далее приводится xaml столбца даты, который используется для отображения только даты, и можно видеть синтаксис части привязки. В этом примере привязывается свойство DateOfBirth внешнего источника данных, которое также содержит часть даты, но поскольку я разместил преобразователь, в этом случае отображается только часть даты.

< data:DataGridTextColumn Header="Date Of Birth" Width="160" MinWidth="120" Binding="{Binding DateOfBirth, Converter={StaticResource DisplayDate}}" CanUserSort="True" IsReadOnly="True" CanUserReorder="False"/>

Ниже показан выходной результат после использования преобразователя даты в файле xaml. Теперь можно видеть, что столбец даты рождения содержит только часть даты, а часть времени не показывается.

Исходный код можно загрузить здесь.

Приветствуются любые комментарии, сообщения об ошибках и предложения!