diff --git a/src/Avalonia.Controls/ISelectionModel.cs b/src/Avalonia.Controls/ISelectionModel.cs index f7283d9d79..34fe626696 100644 --- a/src/Avalonia.Controls/ISelectionModel.cs +++ b/src/Avalonia.Controls/ISelectionModel.cs @@ -32,9 +32,12 @@ namespace Avalonia.Controls void DeselectRangeFromAnchor(int endGroupIndex, int endItemIndex); void DeselectRangeFromAnchorTo(IndexPath index); void Dispose(); - bool? IsSelected(int index); - bool? IsSelected(int groupIndex, int itemIndex); - bool? IsSelectedAt(IndexPath index); + bool IsSelected(int index); + bool IsSelected(int grouIndex, int itemIndex); + public bool IsSelectedAt(IndexPath index); + bool? IsSelectedWithPartial(int index); + bool? IsSelectedWithPartial(int groupIndex, int itemIndex); + bool? IsSelectedWithPartialAt(IndexPath index); void Select(int index); void Select(int groupIndex, int itemIndex); void SelectAll(); diff --git a/src/Avalonia.Controls/SelectionModel.cs b/src/Avalonia.Controls/SelectionModel.cs index d41593b4eb..0531174454 100644 --- a/src/Avalonia.Controls/SelectionModel.cs +++ b/src/Avalonia.Controls/SelectionModel.cs @@ -174,7 +174,7 @@ namespace Avalonia.Controls } set { - var isSelected = IsSelectedAt(value); + var isSelected = IsSelectedWithPartialAt(value); if (!isSelected.HasValue || !isSelected.Value) { @@ -393,7 +393,33 @@ namespace Avalonia.Controls ApplyAutoSelect(); } - public bool? IsSelected(int index) + public bool IsSelected(int index) => _rootNode.IsSelected(index); + + public bool IsSelected(int grouIndex, int itemIndex) + { + return IsSelectedAt(new IndexPath(grouIndex, itemIndex)); + } + + public bool IsSelectedAt(IndexPath index) + { + var path = index; + SelectionNode? node = _rootNode; + + for (int i = 0; i < path.GetSize() - 1; i++) + { + var childIndex = path.GetAt(i); + node = node.GetAt(childIndex, realizeChild: false); + + if (node == null) + { + return false; + } + } + + return node.IsSelected(index.GetAt(index.GetSize() - 1)); + } + + public bool? IsSelectedWithPartial(int index) { if (index < 0) { @@ -404,7 +430,7 @@ namespace Avalonia.Controls return isSelected; } - public bool? IsSelected(int groupIndex, int itemIndex) + public bool? IsSelectedWithPartial(int groupIndex, int itemIndex) { if (groupIndex < 0) { @@ -427,7 +453,7 @@ namespace Avalonia.Controls return isSelected; } - public bool? IsSelectedAt(IndexPath index) + public bool? IsSelectedWithPartialAt(IndexPath index) { var path = index; var isRealized = true; diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 0769df5b48..9c3b0c17b6 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -2041,7 +2041,7 @@ namespace Avalonia.Controls.UnitTests List allIndices = GetIndexPathsInSource(selectionModel.Source); foreach (var index in allIndices) { - bool? isSelected = selectionModel.IsSelectedAt(index); + bool? isSelected = selectionModel.IsSelectedWithPartialAt(index); if (Contains(expectedSelected, index) && !Contains(expectedPartialSelected, index)) { Assert.True(isSelected.Value, index + " is Selected"); @@ -2068,7 +2068,7 @@ namespace Avalonia.Controls.UnitTests { foreach (var index in expectedSelected) { - Assert.True(selectionModel.IsSelectedAt(index).Value, index + " is Selected"); + Assert.True(selectionModel.IsSelectedWithPartialAt(index), index + " is Selected"); } } if (expectedSelected.Count > 0)