Как отформатировать дату в столбце с помощью конвертеров?

У меня есть столбец в моей сетке данных, который правильно привязан к данным и работает. Теперь я бы хотел повлиять на его формат. Итак, я реализовал конвертер и подключил его к полю.

<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" />
Другие вопросы по тегам