Browse Source

Merge pull request #10759 from AvaloniaUI/fixes/treeview-selecteditem-inside-selectionchanged-event

Fix TreeView SelectedItem sync
pull/10834/head
Dan Walmsley 4 years ago
committed by GitHub
parent
commit
bc81b11eff
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      src/Avalonia.Controls/TreeView.cs
  2. 29
      tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

6
src/Avalonia.Controls/TreeView.cs

@ -307,12 +307,14 @@ namespace Avalonia.Controls
private void SelectSingleItem(object item)
{
var oldValue = _selectedItem;
_syncingSelectedItems = true;
SelectedItems.Clear();
SelectedItems.Clear();
_selectedItem = item;
SelectedItems.Add(item);
_syncingSelectedItems = false;
SetAndRaise(SelectedItemProperty, ref _selectedItem, item);
RaisePropertyChanged(SelectedItemProperty, oldValue, _selectedItem);
}
/// <summary>

29
tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

@ -722,6 +722,33 @@ namespace Avalonia.Controls.UnitTests
Assert.True(called);
}
[Fact]
public void SelectedItem_Should_Be_Valid_When_SelectedItemChanged_Event_Raised()
{
using var app = Start();
var data = CreateTestTreeData();
var target = CreateTarget(data: data);
var item = data[0].Children[1].Children[0];
var container = Assert.IsType<TreeViewItem>(target.TreeContainerFromItem(item));
Assert.NotNull(container);
var called = false;
target.SelectionChanged += (s, e) =>
{
Assert.Same(item, e.AddedItems[0]);
Assert.Same(item, target.SelectedItem);
called = true;
};
_mouse.Click(container);
Assert.Equal(item, target.SelectedItem);
Assert.True(container.IsSelected);
Assert.True(called);
}
[Fact]
public void Bound_SelectedItem_Should_Not_Be_Cleared_when_Changing_Selection()
{
@ -756,7 +783,7 @@ namespace Avalonia.Controls.UnitTests
using var app = Start();
var data = CreateTestTreeData();
var target = CreateTarget(data: data, expandAll: false);
target.SelectedItem = data[0].Children[1];
var rootItem = Assert.IsType<TreeViewItem>(target.ContainerFromIndex(0));

Loading…
Cancel
Save