You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ObservableCollection存储Ticks绑定ListView:如何转换为DateTime显示?

刚好做过类似的需求,给你总结几个实用的方案,你可以根据自己的场景选择:

方案一:使用XAML值转换器(ValueConverter)

这是WPF里处理类型转换绑定最常用的思路,核心是写一个轻量的转换器类,让XAML在绑定过程中自动完成Ticks到DateTime的转换:

  1. 先在C#中实现IValueConverter接口:
public class TicksToDateTimeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is long ticks)
        {
            return new DateTime(ticks);
        }
        return DependencyProperty.UnsetValue; // 转换失败时返回空占位
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 如果只是单向显示(不需要把DateTime转回Ticks),这里可以直接抛出异常
        if (value is DateTime dateTime)
        {
            return dateTime.Ticks;
        }
        return DependencyProperty.UnsetValue;
    }
}
  1. 在XAML的资源字典中注册这个转换器:
<Window.Resources>
    <local:TicksToDateTimeConverter x:Key="TicksToDateTimeConverter"/>
</Window.Resources>

(注意local是你项目的命名空间,需要在XAML顶部声明,比如xmlns:local="clr-namespace:YourProjectNamespace")

  1. 绑定ListView列时指定转换器,还能搭配StringFormat自定义日期显示格式:
<ListView ItemsSource="{Binding YourTicksCollection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="From" 
                           DisplayMemberBinding="{Binding From, Converter={StaticResource TicksToDateTimeConverter}, StringFormat='yyyy-MM-dd HH:mm:ss'}"/>
            <GridViewColumn Header="To" 
                           DisplayMemberBinding="{Binding To, Converter={StaticResource TicksToDateTimeConverter}, StringFormat='yyyy-MM-dd HH:mm:ss'}"/>
            <GridViewColumn Header="Note" DisplayMemberBinding="{Binding Note}"/>
        </GridView>
    </ListView.View>
</ListView>
方案二:在数据模型/ViewModel中添加计算属性

如果不想写转换器,也可以直接在你的数据类里加两个只读的计算属性,提前把Ticks转换成DateTime:

public class YourDataItem
{
    public long From { get; set; }
    public long To { get; set; }
    public string Note { get; set; }

    // 自动转换Ticks到DateTime的计算属性
    public DateTime FromDateTime => new DateTime(From);
    public DateTime ToDateTime => new DateTime(To);
}

然后XAML里直接绑定这些计算属性即可,同样可以用StringFormat调整显示样式:

<GridViewColumn Header="From" DisplayMemberBinding="{Binding FromDateTime, StringFormat='yyyy-MM-dd HH:mm:ss'}"/>
<GridViewColumn Header="To" DisplayMemberBinding="{Binding ToDateTime, StringFormat='yyyy-MM-dd HH:mm:ss'}"/>

这种方式更直观,适合不需要双向绑定的纯显示场景,代码维护起来也简单。

补充说明

XAML本身没有直接将长整型Ticks转换为DateTime的内置格式化选项,必须结合C#代码来完成转换——要么通过值转换器实现通用转换逻辑,要么在数据层提前处理好DateTime值。

内容的提问来源于stack exchange,提问作者mnemonic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:52:42