0

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

还可以补充一点,如果我重新启动应用程序,它仍然可以工作,但是我不能让它在一夜之间不出现故障,这太烦人了,不容忽视。

如果需要,请从我的旧问题中获得更多背景信息

4

1 回答 1

1

如果您希望它起作用,您需要在每天午夜之前引发PropertyChanged数据绑定属性的事件。MessageDate在引发此事件之前,不会再次调用转换器。

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

于 2018-04-26T15:22:34.203 回答