GroupStyle HeaderTemplate в ItemsControl не обновляется правильно
Я делаю макет для входящих сообщений и в настоящее время работаю над автоматическим разделением сообщений по дням / неделям / месяцам / годам. Более конкретно, у меня есть заголовок, который говорит "Сегодня" для всех сообщений, полученных на текущую дату, "Вчера" для вчерашнего дня, "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();
}
Можно также добавить, что оно все еще работает, если я перезапускаю приложение, но я не могу оставить его включенным на ночь, если оно не работает со сбоями, это слишком раздражает, чтобы его упускать.
1 ответ
Вам нужно поднять PropertyChanged
событие для базы данных MessageDate
недвижимость до полуночи каждый день, если вы хотите, чтобы это работало. Преобразователь больше не будет вызываться до тех пор, пока не будет вызвано это событие.
Вы могли бы использовать инфраструктуру планирования задач, такую как Quartz.NET или FluentScheduler, чтобы запустить код, который вызывает событие в вашей модели представления в определенное время.