Browse Source

Fix DataGrid sorting column with indexer binding

pull/5131/head
Max Katz 5 years ago
parent
commit
1d3bbf0fb2
  1. 26
      src/Avalonia.Controls.DataGrid/Utils/ReflectionHelper.cs

26
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;

Loading…
Cancel
Save