Browse Source

Add custom IComparer sorting to the DataGrid page

Maksym Katsydan 5 years ago
parent
commit
b94748795a
1 changed files with 33 additions and 4 deletions
  1. 33 4
      samples/ControlCatalog/Pages/DataGridPage.xaml.cs

+ 33 - 4
samples/ControlCatalog/Pages/DataGridPage.xaml.cs

@@ -1,8 +1,12 @@
+using System.Collections;
 using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
 using Avalonia.Controls;
 using Avalonia.Markup.Xaml;
 using ControlCatalog.Models;
 using Avalonia.Collections;
+using Avalonia.Data;
 
 namespace ControlCatalog.Pages
 {
@@ -11,13 +15,23 @@ namespace ControlCatalog.Pages
         public DataGridPage()
         {
             this.InitializeComponent();
+
+            var dataGridSortDescription = DataGridSortDescription.FromPath(nameof(Country.Region), ListSortDirection.Ascending, new ReversedStringComparer());
+            var colelctionView1 = new DataGridCollectionView(Countries.All);
+            colelctionView1.SortDescriptions.Add(dataGridSortDescription);
             var dg1 = this.FindControl<DataGrid>("dataGrid1");
             dg1.IsReadOnly = true;
             dg1.LoadingRow += Dg1_LoadingRow;
-            var collectionView1 = new DataGridCollectionView(Countries.All);
-            //collectionView.GroupDescriptions.Add(new PathGroupDescription("Region"));
-
-            dg1.Items = collectionView1;
+            dg1.Sorting += (s, a) =>
+            {
+                var property = ((a.Column as DataGridBoundColumn)?.Binding as Binding).Path;
+                if (property == dataGridSortDescription.PropertyPath
+                    && !colelctionView1.SortDescriptions.Contains(dataGridSortDescription))
+                {
+                    colelctionView1.SortDescriptions.Add(dataGridSortDescription);
+                }
+            };
+            dg1.Items = colelctionView1;
 
             var dg2 = this.FindControl<DataGrid>("dataGridGrouping");
             dg2.IsReadOnly = true;
@@ -53,5 +67,20 @@ namespace ControlCatalog.Pages
         {
             AvaloniaXamlLoader.Load(this);
         }
+
+        private class ReversedStringComparer : IComparer<object>, IComparer
+        {
+            public int Compare(object x, object y)
+            {
+                if (x is string left && y is string right)
+                {
+                    var reversedLeft = new string(left.Reverse().ToArray());
+                    var reversedRight = new string(right.Reverse().ToArray());
+                    return reversedLeft.CompareTo(reversedRight);
+                }
+
+                return Comparer.Default.Compare(x, y);
+            }
+        }
     }
 }