如何使用转换器格式化列中的日期?
How to format a date in a column using converters?
我的数据网格中有一列数据绑定正确且有效。现在,我想影响它的格式。所以我实现了一个转换器并将其连接到现场。
<local:DateTimeFormat x:Key="IncludeTime" />
...
<igDP:Field Name="CreatedOn"
Label="Label"
Converter="{StaticResource IncludeTime}">
</igDP:Field>
显然,有些地方不对劲,因为我看不到 window 有任何变化。但是,当我在转换器中放置一个断点时,它会被击中,当我在立即 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;
}
...
}
我的猜测是我没有将转换器的输出连接到标记的正确部分,但我不知道如何解决它。
请注意,我正在寻找一种将转换器应用到我的数据网格中的字段的通用方法,因此样式不会这样做(尽管可能有一种涵盖日期、时间和货币的方法)。
我尽量在这种情况下使用 '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>
在 Field 上放置一个转换器是可能的,但我不确定为什么它在您的情况下不起作用。但是,我发现当我有一个比 DateTime 更复杂的 type/object 时,在 Field 上放置一个转换器很有用 绑定到我基本上想对其执行 ToString() 的字段。
它还会更改记录的 DataItem 上的值的类型,这可能会导致稍后的排序或导出问题。例如,在 Field 转换器中将数据转换为字符串意味着将对字符串值而不是 DateTime 进行排序。您可以通过编写自定义 SortComparer 来解决它,但您必须编写更多代码,这可能不是必需的。
无论您想查看什么格式,只需为 XamDateTimeEditor 创建一个样式并在其中指定格式(掩码)即可。您的代码是正确的并返回正确的值,但用于显示该值的编辑器需要知道它,否则它只会以默认格式显示值。 (或者 ValueToDisplayTextConverter 可用于在数字编辑器等任何类型的 control.like 字母数字文本中显示任何类型的文本)
如果您使用简单的文本编辑器,您应该能够看到转换器返回的值。
<igEditors:XamDateTimeEditor Format="MM/dd/yy HH:mm:ss" Width="200" Height="30" Mask="mm/dd/yy hh:mm:ss" />
我在尝试格式化字符串时遇到了同样的问题。我通过在 FieldSettings 上设置 EditAsType 属性 来修复它。
EditAsType = "{x:Type core:String}"
当然,你可以把String换成DateTime或者其他类型。
核心命名空间:
xmlns:core = "clr-namespace:System;assembly=mscorlib"
我的数据网格中有一列数据绑定正确且有效。现在,我想影响它的格式。所以我实现了一个转换器并将其连接到现场。
<local:DateTimeFormat x:Key="IncludeTime" />
...
<igDP:Field Name="CreatedOn"
Label="Label"
Converter="{StaticResource IncludeTime}">
</igDP:Field>
显然,有些地方不对劲,因为我看不到 window 有任何变化。但是,当我在转换器中放置一个断点时,它会被击中,当我在立即 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;
}
...
}
我的猜测是我没有将转换器的输出连接到标记的正确部分,但我不知道如何解决它。
请注意,我正在寻找一种将转换器应用到我的数据网格中的字段的通用方法,因此样式不会这样做(尽管可能有一种涵盖日期、时间和货币的方法)。
我尽量在这种情况下使用 '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>
在 Field 上放置一个转换器是可能的,但我不确定为什么它在您的情况下不起作用。但是,我发现当我有一个比 DateTime 更复杂的 type/object 时,在 Field 上放置一个转换器很有用 绑定到我基本上想对其执行 ToString() 的字段。
它还会更改记录的 DataItem 上的值的类型,这可能会导致稍后的排序或导出问题。例如,在 Field 转换器中将数据转换为字符串意味着将对字符串值而不是 DateTime 进行排序。您可以通过编写自定义 SortComparer 来解决它,但您必须编写更多代码,这可能不是必需的。
无论您想查看什么格式,只需为 XamDateTimeEditor 创建一个样式并在其中指定格式(掩码)即可。您的代码是正确的并返回正确的值,但用于显示该值的编辑器需要知道它,否则它只会以默认格式显示值。 (或者 ValueToDisplayTextConverter 可用于在数字编辑器等任何类型的 control.like 字母数字文本中显示任何类型的文本)
如果您使用简单的文本编辑器,您应该能够看到转换器返回的值。
<igEditors:XamDateTimeEditor Format="MM/dd/yy HH:mm:ss" Width="200" Height="30" Mask="mm/dd/yy hh:mm:ss" />
我在尝试格式化字符串时遇到了同样的问题。我通过在 FieldSettings 上设置 EditAsType 属性 来修复它。
EditAsType = "{x:Type core:String}"
当然,你可以把String换成DateTime或者其他类型。
核心命名空间:
xmlns:core = "clr-namespace:System;assembly=mscorlib"