Browse Source

Merge pull request #1832 from jeffreye/features/treeview

Implement SelectedItemChanged event for TreeView
pull/1863/head
Steven Kirk 8 years ago
committed by GitHub
parent
commit
02a49a12c0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 42
      src/Avalonia.Controls/TreeView.cs
  2. 33
      tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

42
src/Avalonia.Controls/TreeView.cs

@ -1,6 +1,8 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Primitives;
@ -31,6 +33,14 @@ namespace Avalonia.Controls
o => o.SelectedItem,
(o, v) => o.SelectedItem = v);
/// <summary>
/// Defines the <see cref="SelectedItemChanged"/> event.
/// </summary>
public static readonly RoutedEvent<SelectionChangedEventArgs> SelectedItemChangedEvent =
RoutedEvent.Register<TreeView, SelectionChangedEventArgs>(
"SelectedItemChanged",
RoutingStrategies.Bubble);
private object _selectedItem;
/// <summary>
@ -41,6 +51,15 @@ namespace Avalonia.Controls
// HACK: Needed or SelectedItem property will not be found in Release build.
}
/// <summary>
/// Occurs when the control's selection changes.
/// </summary>
public event EventHandler<SelectionChangedEventArgs> SelectedItemChanged
{
add { AddHandler(SelectedItemChangedEvent, value); }
remove { RemoveHandler(SelectedItemChangedEvent, value); }
}
/// <summary>
/// Gets the <see cref="ITreeItemContainerGenerator"/> for the tree view.
/// </summary>
@ -74,6 +93,7 @@ namespace Avalonia.Controls
MarkContainerSelected(container, false);
}
var oldItem = _selectedItem;
SetAndRaise(SelectedItemProperty, ref _selectedItem, value);
if (_selectedItem != null)
@ -86,6 +106,28 @@ namespace Avalonia.Controls
container.BringIntoView();
}
}
if (oldItem != _selectedItem)
{
// Fire the SelectionChanged event
List<object> removed = new List<object>();
if (oldItem != null)
{
removed.Add(oldItem);
}
List<object> added = new List<object>();
if (_selectedItem != null)
{
added.Add(_selectedItem);
}
var changed = new SelectionChangedEventArgs(
SelectedItemChangedEvent,
added,
removed);
RaiseEvent(changed);
}
}
}

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

@ -166,6 +166,39 @@ namespace Avalonia.Controls.UnitTests
Assert.True(container.IsSelected);
}
[Fact]
public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event()
{
var tree = CreateTestTreeData();
var target = new TreeView
{
Template = CreateTreeViewTemplate(),
Items = tree,
};
var visualRoot = new TestRoot();
visualRoot.Child = target;
CreateNodeDataTemplate(target);
ApplyTemplates(target);
var item = tree[0].Children[1].Children[0];
var called = false;
target.SelectedItemChanged += (s, e) =>
{
Assert.Empty(e.RemovedItems);
Assert.Equal(1, e.AddedItems.Count);
Assert.Same(item, e.AddedItems[0]);
called = true;
};
target.SelectedItem = item;
Assert.True(called);
}
[Fact]
public void LogicalChildren_Should_Be_Set()
{

Loading…
Cancel
Save