我正在制作邮件收件箱的布局,目前正在根据天/周/月/年自动分离邮件。更具体地说,我有一个标题,对于当前日期收到的所有邮件都说“今天”,昨天是“昨天”,“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();
}
还可以补充一点,如果我重新启动应用程序它仍然可以工作,但是我不能在没有发生故障的情况下将它留在一夜之间太烦人了。
答案 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.NET或FluentScheduler等任务调度框架来运行在特定时间在视图模型中引发事件的代码。