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

Могу также добавить, что оно все еще работает, если я перезапускаю приложение, но то, что я не могу оставить его включенным на ночь, чтобы оно не работало со сбоями, слишком раздражает, чтобы его не заметить.

Дополнительный контекст, если необходимо, из моего старого вопроса


person Tom    schedule 26.04.2018    source источник


Ответы (1)


Вам нужно вызывать событие PropertyChanged для свойства MessageDate с привязкой к данным каждый день в полночь, если вы хотите, чтобы это работало. Преобразователь не будет вызываться снова, пока не возникнет это событие.

Вы можете использовать структуру планирования задач, такую ​​как Quartz.NET или FluentScheduler для запуска кода, вызывающего событие в вашей модели представления в определенное время.

person mm8    schedule 26.04.2018