Я делаю макет для папки входящих сообщений и в настоящее время работаю над автоматическим разделением сообщений по дням / неделям / месяцам / годам. Более конкретно, у меня есть заголовок, который говорит «Сегодня» для всех сообщений, полученных на текущую дату, «Вчера» для вчерашнего дня, «3+ дня назад» для чего-либо от 3 до 6 дней назад. «На прошлой неделе» за что-нибудь 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();
}
Можно также добавить, что оно все еще работает, если я перезапускаю приложение, но я не могу оставить его включенным на ночь, если оно не работает со сбоями, это слишком раздражает, чтобы его пропустить.
Больше контекста, если нужно, из моего старого вопроса