Как отформатировать дату в столбце с помощью конвертеров?
У меня есть столбец в моей сетке данных, который правильно привязан к данным и работает. Теперь я бы хотел повлиять на его формат. Итак, я реализовал конвертер и подключил его к полю.
<local:DateTimeFormat x:Key="IncludeTime" />
...
<igDP:Field Name="CreatedOn"
Label="Label"
Converter="{StaticResource IncludeTime}">
</igDP:Field>
Видимо, что-то не так, потому что я не вижу изменений в окне. Однако, когда я ставлю точку останова в конвертере, он получает удар, а когда я выполняю оператор в Immediate Window, он получает строку, как и предполагалось.
public class DateTimeFormat : IValueConverter
{
public object Convert(object v, Type t, object p, CultureInfo c)
{
if (v is DateTime)
return System.Convert.ToDateTime(v).ToString("yyyy-MM-dd HH:mm:ss");
return Binding.DoNothing;
}
...
}
Я предполагаю, что я не соединяю выход преобразователя с правой частью разметки, но это лучше, чем разрешать его.
Обратите внимание, что я ищу общий подход с применением конвертеров к полям в моей сетке данных, поэтому стилизация не собирается этого делать (хотя может быть подход, охватывающий даты, время и валюты).
3 ответа
Я пытаюсь использовать ValueToDisplayTextConverters для этого сценария, когда могу.
xmlns:ie="http://infragistics.com/Editors"
...
<local:DateTimeFormat x:Key="IncludeTime" />
...
<igDP:Field Name="CreatedOn"
Label="Label">
<igDP:Field.Settings>
<igDP:FieldSettings>
<igDP:FieldSettings.EditorStyle>
<Style TargetType="{x:Type ie:XamDateTimeEditor}" BasedOn="{StaticResource {x:Type ie:XamDateTimeEditor}}">
<Setter Property="ValueToDisplayTextConverter" Value="{StaticResource IncludeTime}" />
</Style>
</igDP:FieldSettings.EditorStyle>
</igDP:FieldSettings>
</igDP:Field.Settings>
</igDP:Field>
Установка конвертера на поле возможна, хотя я не совсем уверен, почему он не работает в вашем случае. Тем не менее, нахождение конвертера в поле полезно, когда у меня есть более сложный тип / объект, чем DateTime, связанный с полем, где я по сути хочу сделать ToString() для него.
Это также изменяет тип значения в DataItem записи, что может вызвать проблемы для сортировки или экспорта. Например, преобразование данных в строку в конвертере полей означает, что сортировка будет выполняться по строковому значению, а не по DateTime. Вы можете обойти это, написав собственный SortComparer, но вам нужно написать еще больше кода, который может и не понадобиться.
Я столкнулся с той же проблемой при попытке отформатировать строку. Я исправил это, установив свойство EditAsType в FieldSettings.
EditAsType = "{x:Type core:String}"
Конечно, вы можете заменить String на DateTime или другой тип.
Пространство имен ядра:
xmlns:core = "clr-namespace:System;assembly=mscorlib"
В любом формате, который вы хотите увидеть, просто создайте стиль для XamDateTimeEditor и укажите там формат (маску). Ваш код верен и возвращает правильное значение, но редактор, используемый для отображения этого значения, должен знать об этом, или он просто покажет значение в формате по умолчанию. (или ValueToDisplayTextConverter может использоваться для отображения любого типа текста в любом типе элемента управления. Как буквенно-цифровой текст в числовом редакторе и т. д.)
А если вы используете простой текстовый редактор, вы сможете увидеть значение, возвращаемое конвертером.
<igEditors:XamDateTimeEditor Format="MM/dd/yy HH:mm:ss" Width="200" Height="30" Mask="mm/dd/yy hh:mm:ss" />