Я заполняю список объектами со значением DateTime. Я хочу отобразить их в DataGrid, используя ItemsSource в качестве списка следующим образом:
- Все элементы должны быть отсортированы по возрастанию по значению DateTime.
- Если есть несколько элементов с одинаковым значением DateTime, я хочу, чтобы они упорядочивались по возрастанию по их индексу в списке.
Я создал пример приложения для иллюстрации поведения с использованием инфраструктуры MVVM, предоставленной Caliburn.Micro The View:
<StackPanel>
<StackPanel.Resources>
<CollectionViewSource Source="{Binding Files}" x:Key="filesView" IsLiveSortingRequested="True" >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Date" Direction="Ascending"/>
<scm:SortDescription PropertyName="Index" Direction="Ascending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</StackPanel.Resources>
<DataGrid
IsSynchronizedWithCurrentItem="True"
IsReadOnly="True"
ItemsSource="{Binding Source={StaticResource filesView}}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Index" Binding="{Binding Index}" />
<DataGridTextColumn Header="Name" Binding="{Binding Text}" />
<DataGridTextColumn Header="Date" Binding="{Binding Date}" />
</DataGrid.Columns>
</DataGrid>
<Button x:Name="Add">Add</Button>
</StackPanel>
ViewModel:
public class ShellViewModel : Screen
{
private BindableCollection<DataGridItem> _files = new BindableCollection<DataGridItem>();
public BindableCollection<DataGridItem> Files
{
get { return _files; }
set
{
_files = value;
NotifyOfPropertyChange(() => Files);
}
}
public ShellViewModel()
{
}
public void Add()
{
int index = Files.Count;
Random random = new Random();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string name = new string(Enumerable.Repeat(chars, 4).Select(s => s[random.Next(s.Length)]).ToArray());
DateTime date = DateTime.Today.AddDays(random.Next(2));
DataGridItem dgi = new DataGridItem();
dgi.Text = name;
dgi.Date = date;
dgi.Index = index;
Files.Add(dgi);
}
}
public class Item
{
public List<DataGridItem> DataGridItems { get; set; }
}
public class DataGridItem
{
public int Index { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
}
На данный момент мне удалось сделать то, что я хочу добавив дополнительное свойство к объекту, который представлен индексом, а затем связав DataGrid с CollectionViewSource, который имеет два SortDescription (Date и Index).
Существует ли более простой способ достижения моей цели без нужно использовать свойство индекса? Я не хочу вручную устанавливать свойство элемента в качестве индекса List, имея в виду, что вы можете получить индекс элемента в списке, используя метод IndexOf.
Без использования свойства Index что я создал, элементы с одинаковым значением DateTime будут упорядочены по индексу, но по убыванию. Последний добавленный элемент будет первым в верхней части группы элементов с тем же DateTime.