// 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;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Styling;
using Avalonia.Threading;
using Avalonia.VisualTree;
namespace Avalonia.Controls
{
///
/// Displays a hierarchical tree of data.
///
public class TreeView : ItemsControl, ICustomKeyboardNavigation
{
///
/// Defines the property.
///
public static readonly StyledProperty AutoScrollToSelectedItemProperty =
SelectingItemsControl.AutoScrollToSelectedItemProperty.AddOwner();
///
/// Defines the property.
///
public static readonly DirectProperty SelectedItemProperty =
SelectingItemsControl.SelectedItemProperty.AddOwner(
o => o.SelectedItem,
(o, v) => o.SelectedItem = v);
///
/// Defines the event.
///
public static readonly RoutedEvent SelectedItemChangedEvent =
RoutedEvent.Register(
"SelectedItemChanged",
RoutingStrategies.Bubble);
private object _selectedItem;
///
/// Initializes static members of the class.
///
static TreeView()
{
// HACK: Needed or SelectedItem property will not be found in Release build.
}
///
/// Occurs when the control's selection changes.
///
public event EventHandler SelectedItemChanged
{
add { AddHandler(SelectedItemChangedEvent, value); }
remove { RemoveHandler(SelectedItemChangedEvent, value); }
}
///
/// Gets the for the tree view.
///
public new ITreeItemContainerGenerator ItemContainerGenerator =>
(ITreeItemContainerGenerator)base.ItemContainerGenerator;
///
/// Gets or sets a value indicating whether to automatically scroll to newly selected items.
///
public bool AutoScrollToSelectedItem
{
get { return GetValue(AutoScrollToSelectedItemProperty); }
set { SetValue(AutoScrollToSelectedItemProperty, value); }
}
///
/// Gets or sets the selected item.
///
public object SelectedItem
{
get
{
return _selectedItem;
}
set
{
if (_selectedItem != null)
{
var container = ItemContainerGenerator.Index.ContainerFromItem(_selectedItem);
MarkContainerSelected(container, false);
}
var oldItem = _selectedItem;
SetAndRaise(SelectedItemProperty, ref _selectedItem, value);
if (_selectedItem != null)
{
var container = ItemContainerGenerator.Index.ContainerFromItem(_selectedItem);
MarkContainerSelected(container, true);
if (AutoScrollToSelectedItem && container != null)
{
container.BringIntoView();
}
}
if (oldItem != _selectedItem)
{
// Fire the SelectionChanged event
List