GroupStyle HeaderTemplate в ItemsControl не обновляется правильно - PullRequest
0 голосов
/ 26 апреля 2018

Я делаю макет для папки входящих сообщений и в настоящее время работаю над автоматическим разделением сообщений по дням / неделям / месяцам / годам. Более конкретно, у меня есть заголовок, который говорит «Сегодня» для всех сообщений, полученных на текущую дату, «Вчера» для вчерашнего дня, «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 Ответ

0 голосов
/ 26 апреля 2018

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

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

...