Browse Source

Fix SelectionNode.Cleanup.

- Removed disposed child nodes
- Don't dispose child node with descendent selection
pull/3470/head
Steven Kirk 6 years ago
parent
commit
efab1c8266
  1. 22
      src/Avalonia.Controls/SelectionNode.cs
  2. 15
      tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs

22
src/Avalonia.Controls/SelectionNode.cs

@ -342,17 +342,29 @@ namespace Avalonia.Controls
}
}
public void Cleanup()
public bool Cleanup()
{
foreach (var child in _childrenNodes)
var result = SelectedCount == 0;
for (var i = 0; i < _childrenNodes.Count; ++i)
{
child?.Cleanup();
var child = _childrenNodes[i];
if (child?.SelectedCount == 0)
if (child != null)
{
child.Dispose();
if (child.Cleanup())
{
child.Dispose();
_childrenNodes[i] = null;
}
else
{
result = false;
}
}
}
return result;
}
public bool Select(int index, bool select)

15
tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs

@ -930,6 +930,21 @@ namespace Avalonia.Controls.UnitTests
});
}
[Fact]
public void Should_Listen_For_Changes_After_Deselect()
{
var target = new SelectionModel();
var data = CreateNestedData(1, 2, 3);
target.Source = data;
target.Select(1, 0);
target.Deselect(1, 0);
target.Select(1, 0);
((AvaloniaList<object>)data[1]).Insert(0, "foo");
Assert.Equal(new IndexPath(1, 1), target.SelectedIndex);
}
[Fact]
public void Selecting_Item_Raises_SelectionChanged()
{

Loading…
Cancel
Save