ItemsControl中的GroupStyle HeaderTemplate无法正确更新

时间:2018-04-26 07:06:29

标签: wpf datetime itemscontrol ivalueconverter groupstyle

我正在制作邮件收件箱的布局,目前正在根据天/周/月/年自动分离邮件。更具体地说,我有一个标题,对于当前日期收到的所有邮件都说“今天”,昨天是“昨天”,“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();
    }

还可以补充一点,如果我重新启动应用程序它仍然可以工作,但是我不能在没有发生故障的情况下将它留在一夜之间太烦人了。

More context if needed from my older question

1 个答案:

答案 0 :(得分:1)

如果您希望这样做,您需要在每天午夜之前为数据绑定MessageDate属性举起SELECT dati1_v.id_stazione, to_char(dati1_v.data_ora, 'YYYY-MM-DD HH24:00:00'::text) AS date_hour, round(avg(dati1_v.temp1_media), 2) AS t_avg, round(avg(dati1_v.ur1_media), 2) AS hum_avg, sum(dati1_v.pioggia) AS rain_tot, max(dati1_v.pioggia) AS rain_max, round((avg(( SELECT avg(lw.lw) AS avg FROM unnest(dati1_v.lw_top_array) lw(lw))) - lws.top_min) / (lws.top_max - lws.top_min) * 100::numeric, 2) AS lw_top_avg, array_agg(( SELECT round((avg(lw.lw) - lws.top_min) / (lws.top_max - lws.top_min) * 100::numeric, 2) AS round FROM unnest(dati1_v.lw_top_array) lw(lw))) AS lw_top_array, array_cat(dati1_v.lw_top_array) AS lw_top_array_tot, -- array_agg((select lw_top_array from unnest(dati1_v.lw_top_array))) AS lw_top_array_tot, -- array_agg(array_to_string(dati1_v.lw_top_array, ',')) AS lw_top_array_tot, round((avg(( SELECT avg(lw.lw) AS avg FROM unnest(dati1_v.lw_bottom_array) lw(lw))) - lws.bottom_min) / (lws.bottom_max - lws.bottom_min) * 100::numeric, 2) AS lw_bottom_avg, array_agg(( SELECT round((avg(lw.lw) - lws.bottom_min) / (lws.bottom_max - lws.bottom_min) * 100::numeric, 2) AS round FROM unnest(dati1_v.lw_bottom_array) lw(lw))) AS lw_bottom_array FROM dati1_v, lw_settings lws WHERE lws.id = 1 GROUP BY dati1_v.id_stazione, to_char(dati1_v.data_ora, 'YYYY-MM-DD HH24:00:00'::text), lws.top_min, lws.top_max, lws.bottom_min, lws.bottom_max ORDER BY dati1_v.id_stazione, to_char(dati1_v.data_ora, 'YYYY-MM-DD HH24:00:00'::text) 事件。在引发此事件之前,不会再次调用转换器。

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