From cd83809b1f827269ca648e59923f74371b9a0858 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 11 Jan 2014 17:15:44 +0100 Subject: [PATCH] Fix: ModelCollectionTreeNode might add the same handler twice to CollectionChanged event. --- .../Project/Dom/ModelCollectionChangedEvent.cs | 2 +- .../Base/Project/Dom/ModelCollectionTreeNode.cs | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs b/src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs index 0f8698f54b..686330d4e3 100644 --- a/src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs +++ b/src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Dom public void AddHandler(ModelCollectionChangedEventHandler handler) { - if ((handler != null) && !_handlers.Contains(handler)) + if (handler != null) _handlers.Add(handler); } diff --git a/src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs b/src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs index d73f46bfd6..336f7ac31a 100644 --- a/src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs +++ b/src/Main/Base/Project/Dom/ModelCollectionTreeNode.cs @@ -13,6 +13,7 @@ namespace ICSharpCode.SharpDevelop.Dom public abstract class ModelCollectionTreeNode : SharpTreeNode { protected static readonly IComparer NodeTextComparer = KeyComparer.Create((SharpTreeNode n) => n.Text.ToString(), StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase); + protected bool listeningToCollectionChangedEvents; protected ModelCollectionTreeNode() { @@ -37,6 +38,7 @@ namespace ICSharpCode.SharpDevelop.Dom // If children loaded, also detach the collection change event handler if (!LazyLoading) { ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; + listeningToCollectionChangedEvents = false; } } @@ -46,11 +48,15 @@ namespace ICSharpCode.SharpDevelop.Dom if (IsVisible) { if (!LazyLoading) { - ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; + if (!listeningToCollectionChangedEvents) { + ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; + listeningToCollectionChangedEvents = true; + } SynchronizeModelChildren(); } } else { ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; + listeningToCollectionChangedEvents = false; } } @@ -66,7 +72,10 @@ namespace ICSharpCode.SharpDevelop.Dom if (IsSpecialNode()) InsertSpecialNodes(); InsertChildren(ModelChildren); - ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; + if (!listeningToCollectionChangedEvents) { + ModelChildren.CollectionChanged += ModelChildrenCollectionChanged; + listeningToCollectionChangedEvents = true; + } } protected void InsertChildren(IEnumerable children) @@ -101,6 +110,7 @@ namespace ICSharpCode.SharpDevelop.Dom void SwitchBackToLazyLoading() { ModelChildren.CollectionChanged -= ModelChildrenCollectionChanged; + listeningToCollectionChangedEvents = false; Children.Clear(); LazyLoading = true; }