From 1d3bbf0fb2dea70935f6e032c71dbcb90c72b4d7 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 3 Dec 2020 02:56:50 -0500 Subject: [PATCH] Fix DataGrid sorting column with indexer binding --- .../Utils/ReflectionHelper.cs | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/Utils/ReflectionHelper.cs b/src/Avalonia.Controls.DataGrid/Utils/ReflectionHelper.cs index 31c42db076..47d1ac1c0b 100644 --- a/src/Avalonia.Controls.DataGrid/Utils/ReflectionHelper.cs +++ b/src/Avalonia.Controls.DataGrid/Utils/ReflectionHelper.cs @@ -352,19 +352,37 @@ namespace Avalonia.Controls.Utils return null; } - PropertyInfo indexer = null; string stringIndex = propertyPath.Substring(1, propertyPath.Length - 2); - indexer = FindIndexerInMembers(type.GetDefaultMembers(), stringIndex, out index); + var indexer = FindIndexerInMembers(type.GetDefaultMembers(), stringIndex, out index); if (indexer != null) { // We found the indexer, so return it. return indexer; } - if (typeof(IList).IsAssignableFrom(type)) + var elementType = type.GetElementType(); + if (elementType == null) + { + var genericArguments = type.GetGenericArguments(); + if (genericArguments.Length == 1) + { + elementType = genericArguments[0]; + } + } + + if (elementType != null) { // If the object is of type IList, try to use its default indexer. - indexer = FindIndexerInMembers(typeof(IList).GetDefaultMembers(), stringIndex, out index); + if (typeof(IList<>).MakeGenericType(elementType) is Type genericList + && genericList.IsAssignableFrom(type)) + { + indexer = FindIndexerInMembers(genericList.GetDefaultMembers(), stringIndex, out index); + } + if (typeof(IReadOnlyList<>).MakeGenericType(elementType) is Type genericReadOnlyList + && genericReadOnlyList.IsAssignableFrom(type)) + { + indexer = FindIndexerInMembers(genericReadOnlyList.GetDefaultMembers(), stringIndex, out index); + } } return indexer;