Browse Source

Ensure TreeViewItem.IsSelected is set.

When TreeView.SelectedItem changes.
Steven Kirk 10 years ago
parent
commit
bfb334ca5e
2 changed files with 46 additions and 2 deletions
  1. 21 2
      src/Perspex.Controls/TreeView.cs
  2. 25 0
      tests/Perspex.Controls.UnitTests/TreeViewTests.cs

+ 21 - 2
src/Perspex.Controls/TreeView.cs

@@ -46,8 +46,27 @@ namespace Perspex.Controls
         /// </summary>
         public object SelectedItem
         {
-            get { return _selectedItem; }
-            set { SetAndRaise(SelectedItemProperty, ref _selectedItem, value); }
+            get
+            {
+                return _selectedItem;
+            }
+
+            set
+            {
+                if (_selectedItem != null)
+                {
+                    var container = ItemContainerGenerator.Index.ContainerFromItem(_selectedItem);
+                    MarkContainerSelected(container, false);
+                }
+
+                SetAndRaise(SelectedItemProperty, ref _selectedItem, value);
+
+                if (_selectedItem != null)
+                {
+                    var container = ItemContainerGenerator.Index.ContainerFromItem(_selectedItem);
+                    MarkContainerSelected(container, true);
+                }
+            }
         }
 
         /// <inheritdoc/>

+ 25 - 0
tests/Perspex.Controls.UnitTests/TreeViewTests.cs

@@ -107,6 +107,31 @@ namespace Perspex.Controls.UnitTests
             Assert.True(container.IsSelected);
         }
 
+        [Fact]
+        public void Setting_SelectedItem_Should_Set_Container_Selected()
+        {
+            var tree = CreateTestTreeData();
+            var target = new TreeView
+            {
+                Template = CreateTreeViewTemplate(),
+                Items = tree,
+                DataTemplates = CreateNodeDataTemplate(),
+            };
+
+            var visualRoot = new TestRoot();
+            visualRoot.Child = target;
+            ApplyTemplates(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 LogicalChildren_Should_Be_Set()
         {