Идеи о том, как сделать разделитель даты (Сегодня / Завтра) для почтового ящика как приложение?
Итак, у меня есть приложение, похожее на почтовый ящик, и я пытаюсь создать разделитель для каждого дня. Сообщения уже отсортированы по дате (от самой новой к самой старой), но я хочу сделать строку, чтобы разделить их по датам и, возможно, добавить даты поверх строк. Сообщения хранятся в ViewModel и представлены с помощью DataTemplate. Я не могу придумать хороший способ создать эту функциональность и при этом поддерживать аспект MVVM.
До сих пор я думал о том, чтобы как-то сохранить значение даты, а когда это значение отличается от предыдущего, я бы вставил новый разделитель. Затем продолжайте просматривать сообщения, пока я не найду сообщение с другой датой, затем добавьте новый разделитель и так далее, и так далее.
<DataTemplate DataType="{x:Type MessageViewModel}">
<StackPanel>
<TextBlock HorizontalAlignment="Center" Text="{Binding Date}"/> <!-- Only show this when it's a new date -->
<Path Data="m 0 0 200 0"/> <!-- Only show this when it's a new date -->
<Grid>
<!-- Message name, sender and stuff goes here -->
</Grid>
</StackPanel>
</DataTemplate>
Должен ли я сделать новую ViewModel какого-то рода, чтобы хранить эти DateValues и сделать сравнение через конвертер или через триггеры?
1 ответ
Вы можете привязать к сгруппированной CollectionView
и определить GroupStyle
как объяснено здесь: http://www.wpf-tutorial.com/listview-control/listview-grouping/.
Разделитель будет частью GroupStyle
"s ContainerStyle
, Вы также добавили бы новый PropertyGroupDescription("Date)
к GroupDescriptions
коллекция CollectionView
где "Дата" - это имя свойства даты вашей модели электронной почты.
Вы также можете выбрать создать CollectionViewSource
в представлении и привязать к этому:
<Window.Resources>
<CollectionViewSource x:Name="cvs" Source="{Binding ViewModelCollection}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Date" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<ListView ItemsSource="{Binding Source={StaticResource cvs}}">
...
</ListView>