我正在为消息收件箱制作布局,目前正在根据天/周/月/年自动分离消息。更具体地说,对于当前日期收到的所有消息,我有一个标题为“今天”,昨天为“昨天”,3 到 6 天前的任何消息为“3 天前”。“上周”表示 7-13 天前的任何事情,举一些例子。你明白了。
到目前为止,所有这些都很好,除了一件事。如果我一夜之间离开应用程序,我今天的消息将被标记为“今天”,但所有旧标题都不会改变。所以昨天也被标记为“今天”,2天前是“昨天”等等。它们仍然按应有的方式分组,只是标题不会更新。感觉它缺少某种 OnPropertyChanged 功能,但它在当前状态下如何工作?
我的 GroupStyle 是如何设置的:
<ItemsControl>
<ItemsControl.Resources>
<CollectionViewSource x:Key="MessageList" Source="{Binding Messages}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="MessageDate" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<Binding Source="{StaticResource MessageList}"/>
</ItemsControl.ItemsSource>
<ItemsControl.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Margin="0 0 0 15">
<TextBlock Text="{Binding Path=Items[0].MessageDate, Converter={StaticResource DateTimeToStringConverter}}"/>
<Path Data="m 0 0 100 0"/>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ItemsControl.GroupStyle>
</ItemsControl>
我的转换器(从 DateTime 更改为要呈现的字符串)
public class DateTimeToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((DateTime)value == DateTime.Now.Date)
{
return "Today";
}
else if ((DateTime)value == DateTime.Now.AddDays(-1).Date)
{
return "Yesterday";
}
else if ((DateTime)value == DateTime.Now.AddDays(-2).Date)
{
return "2 Days Ago";
}
return "3+ Days Ago";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
还可以补充一点,如果我重新启动应用程序,它仍然可以工作,但是我不能让它在一夜之间不出现故障,这太烦人了,不容忽视。