项目控件中的组样式标题模板无法正确更新



我正在为邮件收件箱制作布局,目前正在根据天/周/月/年自动分隔邮件。更具体地说,我有一个标题,对于当前日期收到的所有消息,"昨天"表示昨天,"3+ 天前"表示 3 到 6 天前的任何消息。"上周"是 7-13 天前的任何内容,仅举几例。你明白了。

到目前为止,所有这些都运行良好,除了一件事。如果我在一夜之间离开应用程序,我今天的消息将被标记为"今天",但所有旧的标题都不会改变。所以昨天也被标记为"今天",2天前是"昨天",依此类推。它们仍然按应有的方式分组,只是标题不会更新。感觉它缺少某种OnPropertyChanged功能,但是在当前状态下它将如何工作?

我的群风格是如何设置的:

<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>

我的转换器(从日期时间更改为字符串以呈现)

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();
}

还可以补充一点,如果我重新启动应用程序,它仍然可以工作,但是我不能让它通宵达旦而不会出现故障,这太烦人了,不容忽视。

如果需要,请从我的旧问题中获得更多背景

如果您希望这样做,则需要在每天午夜之前引发数据绑定MessageDate属性的PropertyChanged事件。在引发此事件之前,不会再次调用转换器。

您可以使用任务调度框架(如 Quartz.NET 或 FluentScheduler)来运行在特定时间在视图模型中引发事件的代码。

最新更新