diff --git a/SharpTreeView/SharpTreeNodeView.cs b/SharpTreeView/SharpTreeNodeView.cs index 4a0980943..5ed2815e9 100644 --- a/SharpTreeView/SharpTreeNodeView.cs +++ b/SharpTreeView/SharpTreeNodeView.cs @@ -97,8 +97,6 @@ namespace ICSharpCode.TreeView } else if (e.PropertyName == "IsExpanded") { if (Node.IsExpanded) ParentTreeView.HandleExpanding(Node); - else - ParentTreeView.HandleCollapsing(Node); } } diff --git a/SharpTreeView/SharpTreeView.cs b/SharpTreeView/SharpTreeView.cs index f2a66c797..683105f53 100644 --- a/SharpTreeView/SharpTreeView.cs +++ b/SharpTreeView/SharpTreeView.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Diagnostics; using System.Linq; using System.Text; @@ -130,10 +131,30 @@ namespace ICSharpCode.TreeView Root.IsExpanded = true; } flattener = new TreeFlattener(Root, ShowRoot); + flattener.CollectionChanged += flattener_CollectionChanged; this.ItemsSource = flattener; } } - + + void flattener_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + // Deselect nodes that are being hidden + if (e.Action == NotifyCollectionChangedAction.Remove) { + List selectedOldItems = null; + foreach (SharpTreeNode node in e.OldItems) { + if (node.IsSelected) { + if (selectedOldItems == null) + selectedOldItems = new List(); + selectedOldItems.Add(node); + } + } + if (selectedOldItems != null) { + var list = SelectedItems.Cast().Except(selectedOldItems).ToList(); + SetSelectedItems(list); + } + } + } + protected override DependencyObject GetContainerForItemOverride() { return new SharpTreeViewItem(); @@ -151,8 +172,16 @@ namespace ICSharpCode.TreeView container.ParentTreeView = this; } + bool doNotScrollOnExpanding; + + /// + /// Handles the node expanding event in the tree view. + /// This method gets called only if the node is in the visible region (a SharpTreeNodeView exists). + /// internal void HandleExpanding(SharpTreeNode node) { + if (doNotScrollOnExpanding) + return; SharpTreeNode lastVisibleChild = node; while (true) { SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible); @@ -174,16 +203,6 @@ namespace ICSharpCode.TreeView } } - internal void HandleCollapsing(SharpTreeNode node) - { - var selectedChilds = node.VisibleDescendants().Where(n => n.IsSelected); - if (selectedChilds.Any()) { - var list = SelectedItems.Cast().Except(selectedChilds).ToList(); - list.AddOnce(node); - SetSelectedItems(list); - } - } - protected override void OnKeyDown(KeyEventArgs e) { SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem; @@ -269,8 +288,10 @@ namespace ICSharpCode.TreeView { if (node == null) throw new ArgumentNullException("node"); + doNotScrollOnExpanding = true; foreach (SharpTreeNode ancestor in node.Ancestors()) ancestor.IsExpanded = true; + doNotScrollOnExpanding = false; base.ScrollIntoView(node); }