| 
					
				 | 
			
			
				@@ -1,1475 +1,1441 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.Collections.Generic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.Collections.ObjectModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.ComponentModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.Linq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using System.Runtime.CompilerServices; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Controls.Generators; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Controls.Presenters; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Controls.Templates; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Data.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Input; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Input.Platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Interactivity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.LogicalTree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.Styling; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Avalonia.UnitTests; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using JetBrains.Annotations; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Moq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////using Xunit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////namespace Avalonia.Controls.UnitTests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////    public class TreeViewTests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        MouseTestHelper _mouse = new MouseTestHelper(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Items_Should_Be_Created() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Child1", "Child2", "Child3" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Items_Should_Be_Created_Using_ItemTemplate_If_Present() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            TreeView target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Child = target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    ItemTemplate = new FuncTreeDataTemplate<Node>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        (_, __) => new Canvas(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        x => x.Children), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var items = target.ItemContainerGenerator.Index.Containers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(5, items.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.All(items, x => Assert.IsType<Canvas>(x.HeaderPresenter.Child)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Items_Should_Be_Created_Using_ItemConatinerTheme_If_Present() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            TreeView target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var theme = new ControlTheme(typeof(TreeViewItem)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Child = target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    ItemContainerTheme = theme, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    ItemTemplate = new FuncTreeDataTemplate<Node>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        (_, __) => new Canvas(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        x => x.Children), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var items = target.ItemContainerGenerator.Index.Containers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(5, items.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.All(items, x => Assert.Same(theme, x.ItemContainerTheme)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Root_ItemContainerGenerator_Containers_Should_Be_Root_Containers() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var container = (TreeViewItem)target.ItemContainerGenerator.Containers.Single().ContainerControl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var header = (TextBlock)container.Header; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal("Root", header.Text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Root_TreeContainerFromItem_Should_Return_Descendant_Item() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // For TreeViewItem to find its parent TreeView, OnAttachedToLogicalTree needs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // to be called, which requires an IStyleRoot. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var container = target.ItemContainerGenerator.Index.ContainerFromItem( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                tree[0].Children[1].Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var header = ((TreeViewItem)container).Header; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var headerContent = ((TextBlock)header).Text; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal("Grandchild2a", headerContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_Item_Should_Select_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(item, target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(container, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Null(target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.False(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_WithControlModifier_Not_Selected_Item_Should_Select_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Collections.Generic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Collections.ObjectModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.ComponentModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Linq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Controls.Generators; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Controls.Presenters; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Controls.Templates; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Data.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Input; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Input.Platform; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Interactivity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.LogicalTree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.Styling; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Avalonia.UnitTests; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Moq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Xunit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace Avalonia.Controls.UnitTests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class TreeViewTests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MouseTestHelper _mouse = new MouseTestHelper(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Items_Should_Be_Created() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Child1", "Child2", "Child3" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Items_Should_Be_Created_Using_ItemTemplate_If_Present() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            TreeView target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Child = target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ItemTemplate = new FuncTreeDataTemplate<Node>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        (_, __) => new Canvas(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        x => x.Children), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var items = target.GetRealizedTreeContainers() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(5, items.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.All(items, x => Assert.IsType<Canvas>(x.HeaderPresenter.Child)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Items_Should_Be_Created_Using_ItemConatinerTheme_If_Present() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            TreeView target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var theme = new ControlTheme(typeof(TreeViewItem)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Child = target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ItemContainerTheme = theme, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ItemTemplate = new FuncTreeDataTemplate<Node>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        (_, __) => new Canvas(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        x => x.Children), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var items = target.GetRealizedTreeContainers() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(5, items.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.All(items, x => Assert.Same(theme, x.ItemContainerTheme)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Root_ItemContainerGenerator_Containers_Should_Be_Root_Containers() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = CreateTestTreeData(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var container = (TreeViewItem)target.GetRealizedContainers().Single(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var header = (TextBlock)container.HeaderPresenter.Child; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal("Root", header.Text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Root_TreeContainerFromItem_Should_Return_Descendant_Item() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // For TreeViewItem to find its parent TreeView, OnAttachedToLogicalTree needs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // to be called, which requires an IStyleRoot. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var container = target.TreeContainerFromItem(tree[0].Children[1].Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var header = ((TreeViewItem)container).HeaderPresenter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var headerContent = ((TextBlock)header.Child).Text; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal("Grandchild2a", headerContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_Item_Should_Select_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container = (TreeViewItem)target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(item, target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container = (TreeViewItem)target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(container, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Null(target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.False(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_WithControlModifier_Not_Selected_Item_Should_Select_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item1 = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container1 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item2 = tree[0].Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container2 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item1 = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container1 = (TreeViewItem)target.TreeContainerFromItem(item1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(container1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(container2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectedItem = item1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container1.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(container2, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(item2, target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.False(container1.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container2.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_And_Remove_From_SelectedItems() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item2 = tree[0].Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container2 = (TreeViewItem)target.TreeContainerFromItem(item2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(container1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(container2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectedItem = item1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container1.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(container2, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(item2, target.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.False(container1.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container2.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_And_Remove_From_SelectedItems() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item1 = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item2 = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(item1Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(item1Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(item2Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(item2Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(new[] { item1, item2 }, target.SelectedItems.OfType<Node>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item1 = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item2 = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item1Container = (TreeViewItem)target.TreeContainerFromItem(item1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item2Container = (TreeViewItem)target.TreeContainerFromItem(item2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(item1Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(item1Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(item2Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(item2Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(item1Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.False(item1Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(new[] { item1, item2 }, target.SelectedItems.OfType<Node>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.DoesNotContain(item1, target.SelectedItems.OfType<Node>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(item1Container, KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.False(item1Container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_WithShiftModifier_DownDirection_Should_Select_Range_Of_Items() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.DoesNotContain(item1, target.SelectedItems.OfType<Node>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_WithShiftModifier_DownDirection_Should_Select_Range_Of_Items() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_WithShiftModifier_UpDirection_Should_Select_Range_Of_Items() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_WithShiftModifier_UpDirection_Should_Select_Range_Of_Items() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clicking_First_Item_Of_SelectedItems_Should_Select_Only_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                foreach (var child in rootNode.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    if (child == from) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Assert.False(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Setting_SelectedItem_Should_Set_Container_Selected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var called = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectionChanged += (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 Bound_SelectedItem_Should_Not_Be_Cleared_when_Changing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var dataContext = new TestDataContext(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    DataContext = dataContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.Bind(TreeView.ItemsProperty, new Binding("Items")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.Bind(TreeView.SelectedItemProperty, new Binding("SelectedItem")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var selectedValues = new List<object>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                dataContext.PropertyChanged += (_, e) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    if (e.PropertyName == nameof(TestDataContext.SelectedItem)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        selectedValues.Add(dataContext.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                selectedValues.Add(dataContext.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click((Interactive)target.Presenter.Panel.Children[0], MouseButton.Left); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click((Interactive)target.Presenter.Panel.Children[2], MouseButton.Left); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(3, selectedValues.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(new[] { null, "Item 0", "Item 2" }, selectedValues.ToArray()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void LogicalChildren_Should_Be_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = new[] { "Foo", "Bar", "Baz " }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var result = target.GetLogicalChildren() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Select(x => x.Header) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .OfType<TextBlock>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Select(x => x.Text) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Foo", "Bar", "Baz " }, result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Removing_Item_Should_Remove_Itself_And_Children_From_Index() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(5, target.ItemContainerGenerator.Index.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            tree[0].Children.RemoveAt(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(3, target.ItemContainerGenerator.Index.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void DataContexts_Should_Be_Correctly_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var items = new object[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                "Foo", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new Node { Value = "Bar" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new TextBlock { Text = "Baz" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new TreeViewItem { Header = "Qux" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                DataContext = "Base", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                DataTemplates = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    new FuncDataTemplate<Node>((x, _) => new Button { Content = x }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = items, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var dataContexts = target.Presenter.Panel.Children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Cast<Control>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Select(x => x.DataContext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new object[] { items[0], items[1], "Base", "Base" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                dataContexts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Control_Item_Should_Not_Be_NameScope() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var items = new object[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new TreeViewItem(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = items, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            target.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            target.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var item = target.Presenter.Panel.LogicalChildren[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Null(NameScope.GetNameScope((TreeViewItem)item)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Should_React_To_Children_Changing() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Child1", "Child2", "Child3" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Make sure that the binding to Node.Children does not get collected. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            GC.Collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            data[0].Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Value = "NewChild1", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(new[] { "NewChild1" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Keyboard_Navigation_Should_Move_To_Last_Selected_Node() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var focus = FocusManager.Instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var navigation = AvaloniaLocator.Current.GetService<IKeyboardNavigationHandler>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var button = new Button(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Child = new StackPanel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        Children = { target, button }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = data[0].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var node = target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                node.Focus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                navigation.Move(focus.Current, NavigationDirection.Next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Same(button, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                navigation.Move(focus.Current, NavigationDirection.Next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Keyboard_Navigation_Should_Not_Crash_If_Selected_Item_Is_not_In_Tree() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var focus = FocusManager.Instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var navigation = AvaloniaLocator.Current.GetService<IKeyboardNavigationHandler>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var selectedNode = new Node { Value = "Out of Tree Selected Item" }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectedItem = selectedNode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var button = new Button(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Child = new StackPanel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        Children = { target, button }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = data[0].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var node = target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.NotNull(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectedItem = selectedNode; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                node.Focus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var next = KeyboardNavigationHandler.GetNext(node, NavigationDirection.Previous); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Pressing_SelectAll_Gesture_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (UnitTestApplication.Start()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Pressing_SelectAll_Gesture_With_Downward_Range_Selected_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Pressing_SelectAll_Gesture_With_Upward_Range_Selected_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Right_Click_On_SelectedItem_Should_Not_Clear_Existing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (UnitTestApplication.Start()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new Mock<PlatformHotkeyConfiguration>().Object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.SelectAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                AssertChildrenSelected(target, tree[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(5, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click((Interactive)target.Presenter.Panel.Children[0], MouseButton.Right); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(5, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Right_Click_On_UnselectedItem_Should_Clear_Existing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var then = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var thenContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(then); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(2, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(thenContainer, MouseButton.Right); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Shift_Right_Click_Should_Not_Select_Multiple() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(fromContainer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Ctrl_Right_Click_Should_Not_Select_Multiple() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var to = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(fromContainer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void TreeViewItems_Level_Should_Be_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(0, GetItem(target, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 1).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 2).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(2, GetItem(target, 0, 1, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void TreeViewItems_Level_Should_Be_Set_For_Derived_TreeView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new DerivedTreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(0, GetItem(target, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 1).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, GetItem(target, 0, 2).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(2, GetItem(target, 0, 1, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Adding_Node_To_Removed_And_ReAdded_Parent_Should_Not_Crash() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Issue #2985 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var parent = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var node = parent.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            parent.Children.Remove(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            parent.Children.Add(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var item = target.ItemContainerGenerator.Index.ContainerFromItem(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(new[] { item }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // #2985 causes ArgumentException here. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            node.Children.Add(new Node()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Auto_Expanding_In_Style_Should_Not_Break_Range_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Issue #2980. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var target = new DerivedTreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Items = new List<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    new Node { Value = "Root1", }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    new Node { Value = "Root2", }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var visualRoot = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Styles = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        new Style(x => x.OfType<TreeViewItem>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            Setters = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                                new Setter(TreeViewItem.IsExpandedProperty, true), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Child = target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(GetItem(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                _mouse.Click(GetItem(target, 1), modifiers: KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Removing_TreeView_From_Root_Should_Preserve_TreeViewItems() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Issue #3328 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(5, target.ItemContainerGenerator.Index.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(5, target.ItemContainerGenerator.Index.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, target.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var rootNode = Assert.IsType<TreeViewItem>(target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(3, rootNode.ItemContainerGenerator.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(3, rootNode.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var child2Node = Assert.IsType<TreeViewItem>(rootNode.Presenter.Panel.Children[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, child2Node.ItemContainerGenerator.Containers.Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Equal(1, child2Node.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Clearing_TreeView_Items_Clears_Index() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Issue #3551 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            root.Child = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            tree.Clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            Assert.Empty(target.ItemContainerGenerator.Index.Containers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        public void Can_Use_Derived_TreeViewItem() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var target = new DerivedTreeViewWithDerivedTreeViewItems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            // Verify that all items are DerivedTreeViewItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            VerifyItemType(target.ItemContainerGenerator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            void VerifyItemType(ITreeItemContainerGenerator containerGenerator) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                foreach (var container in containerGenerator.Index.Containers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    var item = Assert.IsType<DerivedTreeViewItem>(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    if (item.ItemCount > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        VerifyItemType(item.ItemContainerGenerator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void ApplyTemplates(TreeView tree) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            tree.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            tree.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            ApplyTemplates(tree.Presenter.Panel.Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void ApplyTemplates(IEnumerable<Control> controls) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            foreach (TreeViewItem control in controls) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                control.Template = CreateTreeViewItemTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                control.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                control.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                control.HeaderPresenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                ApplyTemplates(control.Presenter.Panel.Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private TreeViewItem GetItem(TreeView target, params int[] indexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            var c = (ItemsControl)target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            foreach (var index in indexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var item = ((IList)c.Items)[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                c = (ItemsControl)target.ItemContainerGenerator.Index.ContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return (TreeViewItem)c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private IList<Node> CreateTestTreeData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Value = "Root", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            Value = "Child1", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            Value = "Child2", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                                    Value = "Grandchild2a", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                            Value = "Child3", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void CreateNodeDataTemplate(Control control) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            control.DataTemplates.Add(new TestTreeDataTemplate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private IControlTemplate CreateTreeViewTemplate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return new FuncControlTemplate<TreeView>((parent, scope) => new ItemsPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Name = "PART_ItemsPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }.RegisterInNameScope(scope)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private IControlTemplate CreateTreeViewItemTemplate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return new FuncControlTemplate<TreeViewItem>((parent, scope) => new Panel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Children = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    new ContentPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        Name = "PART_HeaderPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        [~ContentPresenter.ContentProperty] = parent[~TreeViewItem.HeaderProperty], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    }.RegisterInNameScope(scope), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    new ItemsPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        Name = "PART_ItemsPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    }.RegisterInNameScope(scope) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void ExpandAll(TreeView tree) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            foreach (var i in tree.ItemContainerGenerator.Containers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                tree.ExpandSubTree((TreeViewItem)i.ContainerControl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private List<string> ExtractItemHeader(TreeView tree, int level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return ExtractItemContent(tree.Presenter.Panel, 0, level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Select(x => x.Header) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .OfType<TextBlock>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .Select(x => x.Text) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private IEnumerable<TreeViewItem> ExtractItemContent(Panel panel, int currentLevel, int level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            foreach (TreeViewItem container in panel.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                if (container.Template == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    container.Template = CreateTreeViewItemTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    container.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                if (currentLevel == level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    yield return container; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    foreach (var child in ExtractItemContent(container.Presenter.Panel, currentLevel + 1, level)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                        yield return child; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void ClickContainer(Control container, KeyModifiers modifiers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            _mouse.Click(container, modifiers: modifiers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private void AssertChildrenSelected(TreeView treeView, Node rootNode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            foreach (var child in rootNode.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var container = (TreeViewItem)treeView.ItemContainerGenerator.Index.ContainerFromItem(child); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private IDisposable Application() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            return UnitTestApplication.Start( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                TestServices.MockThreadingInterface.With( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    focusManager: new FocusManager(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    keyboardDevice: () => new KeyboardDevice(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    keyboardNavigation: new KeyboardNavigationHandler(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    inputManager: new InputManager())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class Node : NotifyingBase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            private IAvaloniaList<Node> _children; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public string Value { get; set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public IAvaloniaList<Node> Children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                get 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    return _children; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    _children = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    RaisePropertyChanged(nameof(Children)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class TestTreeDataTemplate : ITreeDataTemplate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public Control Build(object param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var node = (Node)param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                return new TextBlock { Text = node.Value }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public InstancedBinding ItemsSelector(object item) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                var obs = ExpressionObserver.Create(item, o => (o as Node).Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                return InstancedBinding.OneWay(obs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public bool Match(object data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                return data is Node; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class DerivedTreeView : TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class DerivedTreeViewWithDerivedTreeViewItems : TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            protected override ITreeItemContainerGenerator CreateTreeItemContainerGenerator() => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                CreateTreeItemContainerGenerator<DerivedTreeViewItem>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class DerivedTreeViewItem : TreeViewItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            protected override IItemContainerGenerator CreateItemContainerGenerator() => CreateTreeItemContainerGenerator<DerivedTreeViewItem>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        private class TestDataContext : INotifyPropertyChanged 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            private string _selectedItem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public TestDataContext() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                Items = new ObservableCollection<string>(Enumerable.Range(0, 5).Select(i => $"Item {i}")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public ObservableCollection<string> Items { get; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public string SelectedItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                get { return _selectedItem; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    _selectedItem = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItem))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////            public event PropertyChangedEventHandler PropertyChanged; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-////} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clicking_First_Item_Of_SelectedItems_Should_Select_Only_It() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(fromContainer.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                foreach (var child in rootNode.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (child == from) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var container = (TreeViewItem)target.TreeContainerFromItem(child); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Assert.False(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Setting_SelectedItem_Should_Set_Container_Selected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container = (TreeViewItem)target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = tree[0].Children[1].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var called = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectionChanged += (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 Bound_SelectedItem_Should_Not_Be_Cleared_when_Changing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var dataContext = new TestDataContext(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    DataContext = dataContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.Bind(TreeView.ItemsProperty, new Binding("Items")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.Bind(TreeView.SelectedItemProperty, new Binding("SelectedItem")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var selectedValues = new List<object>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dataContext.PropertyChanged += (_, e) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (e.PropertyName == nameof(TestDataContext.SelectedItem)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        selectedValues.Add(dataContext.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                selectedValues.Add(dataContext.SelectedItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click((Interactive)target.Presenter.Panel.Children[0], MouseButton.Left); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click((Interactive)target.Presenter.Panel.Children[2], MouseButton.Left); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(3, selectedValues.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(new[] { null, "Item 0", "Item 2" }, selectedValues.ToArray()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void LogicalChildren_Should_Be_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = new[] { "Foo", "Bar", "Baz " }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var result = target.GetLogicalChildren() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .OfType<TreeViewItem>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Select(x => x.HeaderPresenter.Child) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .OfType<TextBlock>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Select(x => x.Text) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Foo", "Bar", "Baz " }, result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void DataContexts_Should_Be_Correctly_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var items = new object[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                "Foo", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new Node { Value = "Bar" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new TextBlock { Text = "Baz" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new TreeViewItem { Header = "Qux" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DataContext = "Base", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DataTemplates = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new FuncDataTemplate<Node>((x, _) => new Button { Content = x }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = items, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var dataContexts = target.Presenter.Panel.Children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Cast<Control>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Select(x => x.DataContext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new object[] { items[0], items[1], "Base", "Base" }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dataContexts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Control_Item_Should_Not_Be_NameScope() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var items = new object[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new TreeViewItem(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = items, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            target.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var item = target.Presenter.Panel.LogicalChildren[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Null(NameScope.GetNameScope((TreeViewItem)item)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Should_React_To_Children_Changing() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Child1", "Child2", "Child3" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Make sure that the binding to Node.Children does not get collected. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            GC.Collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data[0].Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Value = "NewChild1", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(new[] { "NewChild1" }, ExtractItemHeader(target, 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Keyboard_Navigation_Should_Move_To_Last_Selected_Node() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var focus = FocusManager.Instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var navigation = AvaloniaLocator.Current.GetService<IKeyboardNavigationHandler>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var button = new Button(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Child = new StackPanel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Children = { target, button }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = data[0].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var node = target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectedItem = item; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                node.Focus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                navigation.Move(focus.Current, NavigationDirection.Next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Same(button, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                navigation.Move(focus.Current, NavigationDirection.Next); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Keyboard_Navigation_Should_Not_Crash_If_Selected_Item_Is_not_In_Tree() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var focus = FocusManager.Instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var navigation = AvaloniaLocator.Current.GetService<IKeyboardNavigationHandler>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var data = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var selectedNode = new Node { Value = "Out of Tree Selected Item" }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectedItem = selectedNode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var button = new Button(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var root = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Child = new StackPanel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Children = { target, button }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = data[0].Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var node = target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.NotNull(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectedItem = selectedNode; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                node.Focus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Same(node, focus.Current); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var next = KeyboardNavigationHandler.GetNext(node, NavigationDirection.Previous); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Pressing_SelectAll_Gesture_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (UnitTestApplication.Start()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Pressing_SelectAll_Gesture_With_Downward_Range_Selected_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Pressing_SelectAll_Gesture_With_Upward_Range_Selected_Should_Select_All_Nodes() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children.Last(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var selectAllGesture = keymap.SelectAll.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var keyEvent = new KeyEventArgs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    RoutedEvent = InputElement.KeyDownEvent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Key = selectAllGesture.Key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    KeyModifiers = selectAllGesture.KeyModifiers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.RaiseEvent(keyEvent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Right_Click_On_SelectedItem_Should_Not_Clear_Existing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (UnitTestApplication.Start()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new Mock<PlatformHotkeyConfiguration>().Object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.SelectAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AssertChildrenSelected(target, tree[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(5, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click((Interactive)target.Presenter.Panel.Children[0], MouseButton.Right); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(5, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Right_Click_On_UnselectedItem_Should_Clear_Existing_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var then = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var thenContainer = (TreeViewItem)target.TreeContainerFromItem(then); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(fromContainer, KeyModifiers.None); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClickContainer(toContainer, KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(2, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(thenContainer, MouseButton.Right); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Shift_Right_Click_Should_Not_Select_Multiple() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(fromContainer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Ctrl_Right_Click_Should_Not_Select_Multiple() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var from = rootNode.Children[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var to = rootNode.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var fromContainer = (TreeViewItem)target.TreeContainerFromItem(from); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var toContainer = (TreeViewItem)target.TreeContainerFromItem(to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(fromContainer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.Equal(1, target.SelectedItems.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void TreeViewItems_Level_Should_Be_Set() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(0, GetItem(target, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 1).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 2).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(2, GetItem(target, 0, 1, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void TreeViewItems_Level_Should_Be_Set_For_Derived_TreeView() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new DerivedTreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(0, GetItem(target, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 1).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, GetItem(target, 0, 2).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(2, GetItem(target, 0, 1, 0).Level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Adding_Node_To_Removed_And_ReAdded_Parent_Should_Not_Crash() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Issue #2985 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var visualRoot = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            visualRoot.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var parent = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var node = parent.Children[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            parent.Children.Remove(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            parent.Children.Add(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var item = target.TreeContainerFromItem(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(new[] { item }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // #2985 causes ArgumentException here. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            node.Children.Add(new Node()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Auto_Expanding_In_Style_Should_Not_Break_Range_Selection() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Issue #2980. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (Application()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var target = new DerivedTreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SelectionMode = SelectionMode.Multiple, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Items = new List<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new Node { Value = "Root1", }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new Node { Value = "Root2", }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var visualRoot = new TestRoot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Styles = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        new Style(x => x.OfType<TreeViewItem>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Setters = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                new Setter(TreeViewItem.IsExpandedProperty, true), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Child = target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(GetItem(target, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _mouse.Click(GetItem(target, 1), modifiers: KeyModifiers.Shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Removing_TreeView_From_Root_Should_Preserve_TreeViewItems() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Issue #3328 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ExpandAll(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(5, target.GetRealizedTreeContainers().Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root.Child = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(5, target.GetRealizedTreeContainers().Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, target.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var rootNode = Assert.IsType<TreeViewItem>(target.Presenter.Panel.Children[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(3, rootNode.GetRealizedContainers().Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(3, rootNode.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var child2Node = Assert.IsType<TreeViewItem>(rootNode.Presenter.Panel.Children[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, child2Node.GetRealizedContainers().Count()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Equal(1, child2Node.Presenter.Panel.Children.Count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Clearing_TreeView_Items_Clears_Index() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Issue #3551 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var root = new TestRoot(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root.Child = target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            CreateNodeDataTemplate(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var rootNode = tree[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var container = (TreeViewItem)target.TreeContainerFromItem(rootNode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.NotNull(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root.Child = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.Clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Empty(target.GetRealizedContainers()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Fact] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Can_Use_Derived_TreeViewItem() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var tree = CreateTestTreeData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var target = new DerivedTreeViewWithDerivedTreeViewItems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Template = CreateTreeViewTemplate(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = tree, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Verify that all items are DerivedTreeViewItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var container in target.GetRealizedTreeContainers()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.IsType<DerivedTreeViewItem>(container); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void ApplyTemplates(TreeView tree) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ApplyTemplates(tree.Presenter.Panel.Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void ApplyTemplates(IEnumerable<Control> controls) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (TreeViewItem control in controls) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                control.Template = CreateTreeViewItemTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                control.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                control.Presenter.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ((ContentPresenter)control.HeaderPresenter).UpdateChild(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ApplyTemplates(control.Presenter.Panel.Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private TreeViewItem GetItem(TreeView target, params int[] indexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var c = (ItemsControl)target; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var index in indexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var item = ((IList)c.Items)[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                c = (ItemsControl)target.TreeContainerFromItem(item); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return (TreeViewItem)c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IList<Node> CreateTestTreeData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Value = "Root", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Value = "Child1", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Value = "Child2", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Children = new AvaloniaList<Node> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    Value = "Grandchild2a", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        new Node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Value = "Child3", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void CreateNodeDataTemplate(Control control) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            control.DataTemplates.Add(new TestTreeDataTemplate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IControlTemplate CreateTreeViewTemplate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new FuncControlTemplate<TreeView>((parent, scope) => new ItemsPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Name = "PART_ItemsPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }.RegisterInNameScope(scope)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IControlTemplate CreateTreeViewItemTemplate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new FuncControlTemplate<TreeViewItem>((parent, scope) => new Panel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Children = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new ContentPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Name = "PART_HeaderPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        [~ContentPresenter.ContentProperty] = parent[~TreeViewItem.HeaderProperty], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        [~ContentPresenter.ContentTemplateProperty] = parent[~TreeViewItem.HeaderTemplateProperty], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }.RegisterInNameScope(scope), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new ItemsPresenter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Name = "PART_ItemsPresenter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }.RegisterInNameScope(scope) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void ExpandAll(TreeView tree) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var i in tree.GetRealizedContainers()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tree.ExpandSubTree((TreeViewItem)i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private List<string> ExtractItemHeader(TreeView tree, int level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ExtractItemContent(tree.Presenter.Panel, 0, level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Select(x => x.HeaderPresenter.Child) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .OfType<TextBlock>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .Select(x => x.Text) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IEnumerable<TreeViewItem> ExtractItemContent(Panel panel, int currentLevel, int level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (TreeViewItem container in panel.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (container.Template == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    container.Template = CreateTreeViewItemTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    container.ApplyTemplate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (currentLevel == level) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    yield return container; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var child in ExtractItemContent(container.Presenter.Panel, currentLevel + 1, level)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        yield return child; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void ClickContainer(Control container, KeyModifiers modifiers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _mouse.Click(container, modifiers: modifiers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private void AssertChildrenSelected(TreeView treeView, Node rootNode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var child in rootNode.Children) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var container = (TreeViewItem)treeView.TreeContainerFromItem(child); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Assert.True(container.IsSelected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private IDisposable Application() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return UnitTestApplication.Start( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                TestServices.MockThreadingInterface.With( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    focusManager: new FocusManager(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    keyboardDevice: () => new KeyboardDevice(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    keyboardNavigation: new KeyboardNavigationHandler(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    inputManager: new InputManager())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class Node : NotifyingBase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            private IAvaloniaList<Node> _children; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public string Value { get; set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public IAvaloniaList<Node> Children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                get 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return _children; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _children = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    RaisePropertyChanged(nameof(Children)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class TestTreeDataTemplate : ITreeDataTemplate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public Control Build(object param) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var node = (Node)param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return new TextBlock { Text = node.Value }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public InstancedBinding ItemsSelector(object item) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var obs = ExpressionObserver.Create(item, o => (o as Node).Children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return InstancedBinding.OneWay(obs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public bool Match(object data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return data is Node; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class DerivedTreeView : TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class DerivedTreeViewWithDerivedTreeViewItems : TreeView 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            protected internal override Control CreateContainerOverride() => new DerivedTreeViewItem(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class DerivedTreeViewItem : TreeViewItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private class TestDataContext : INotifyPropertyChanged 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            private string _selectedItem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public TestDataContext() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Items = new ObservableCollection<string>(Enumerable.Range(0, 5).Select(i => $"Item {i}")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public ObservableCollection<string> Items { get; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public string SelectedItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                get { return _selectedItem; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _selectedItem = value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedItem))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public event PropertyChangedEventHandler PropertyChanged; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |