diff --git a/Xwt.WPF/Xwt.WPFBackend/ExTreeView.cs b/Xwt.WPF/Xwt.WPFBackend/ExTreeView.cs index 2ff994ed8..2b9988255 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ExTreeView.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ExTreeView.cs @@ -47,6 +47,9 @@ namespace Xwt.WPFBackend public class ExTreeView : SWC.TreeView, IWpfWidget { + int deferSelectionChange = 0; + IList oldSelectedItems; + public ExTreeView() { SelectedItems = new ObservableCollection (); @@ -217,8 +220,50 @@ private ExTreeViewItem GetTreeItem (object item) private static readonly PropertyInfo IsSelectionChangeActiveProperty = typeof (System.Windows.Controls.TreeView).GetProperty ("IsSelectionChangeActive", BindingFlags.NonPublic | BindingFlags.Instance); + void BeginDeferSelectionChanged() + { + if (deferSelectionChange == 0) + { + oldSelectedItems = new List(SelectedItems.Count); + foreach (var item in SelectedItems) + { + oldSelectedItems.Add(item); + } + } + deferSelectionChange++; + } + + bool SelectionIsRealChanged() + { + if (oldSelectedItems == null || SelectedItems.Count != oldSelectedItems.Count) + return true; + + for (var i = 0; i < SelectedItems.Count; i++) + { + if (SelectedItems[i] != oldSelectedItems[i]) + { + return true; + } + } + return false; + } + + void EndDeferSelectionChanged() + { + if (deferSelectionChange > 0) + { + deferSelectionChange--; + + if (deferSelectionChange == 0 && SelectionIsRealChanged()) + { + OnSelectedItemsChanged(EventArgs.Empty); + } + } + } + private void SelectedItemsCollectionChanged (object sender, NotifyCollectionChangedEventArgs e) { + BeginDeferSelectionChanged(); bool changeActive = (bool)IsSelectionChangeActiveProperty.GetValue (this, null); if (!changeActive) IsSelectionChangeActiveProperty.SetValue (this, true, null); @@ -264,7 +309,7 @@ private void SelectedItemsCollectionChanged (object sender, NotifyCollectionChan break; } - OnSelectedItemsChanged (EventArgs.Empty); + EndDeferSelectionChanged(); if (!changeActive) IsSelectionChangeActiveProperty.SetValue (this, changeActive, null); @@ -317,6 +362,7 @@ public void SelectItem(ExTreeViewItem item) if (item == null) return; + BeginDeferSelectionChanged(); FocusItem(item); if (!CtrlPressed) SelectedItems.Clear(); @@ -344,6 +390,7 @@ public void SelectItem(ExTreeViewItem item) else SelectedItems.Add(item.DataContext); } + EndDeferSelectionChanged(); } private IEnumerable GetAllVisibleItems(ItemsControl itemsControl)