Автосортировка DataGrid по дате и индексу списка в WPF - PullRequest
0 голосов
/ 03 мая 2020

Я заполняю список объектами со значением 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...