ObservableCollection存储Ticks绑定ListView:如何转换为DateTime显示?
刚好做过类似的需求,给你总结几个实用的方案,你可以根据自己的场景选择:
方案一:使用XAML值转换器(ValueConverter)
这是WPF里处理类型转换绑定最常用的思路,核心是写一个轻量的转换器类,让XAML在绑定过程中自动完成Ticks到DateTime的转换:
- 先在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; } }
- 在XAML的资源字典中注册这个转换器:
<Window.Resources> <local:TicksToDateTimeConverter x:Key="TicksToDateTimeConverter"/> </Window.Resources>
(注意local是你项目的命名空间,需要在XAML顶部声明,比如xmlns:local="clr-namespace:YourProjectNamespace")
- 绑定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
相关产品推荐
相关产品推荐

