From 85216c8b988264332d168d66a80bad2543072f79 Mon Sep 17 00:00:00 2001 From: Stephane Delcroix Date: Wed, 13 Sep 2017 14:53:43 +0200 Subject: [C] MergedRD: new tests and minor fixes --- Xamarin.Forms.Core/ResourceDictionary.cs | 70 +++++++++++++++++--------------- 1 file changed, 37 insertions(+), 33 deletions(-) (limited to 'Xamarin.Forms.Core/ResourceDictionary.cs') diff --git a/Xamarin.Forms.Core/ResourceDictionary.cs b/Xamarin.Forms.Core/ResourceDictionary.cs index c9d59f83..b3cb3214 100644 --- a/Xamarin.Forms.Core/ResourceDictionary.cs +++ b/Xamarin.Forms.Core/ResourceDictionary.cs @@ -14,8 +14,9 @@ namespace Xamarin.Forms { static ConditionalWeakTable s_instances = new ConditionalWeakTable(); readonly Dictionary _innerDictionary = new Dictionary(); - + ResourceDictionary _mergedInstance; Type _mergedWith; + [TypeConverter (typeof(TypeTypeConverter))] public Type MergedWith { get { return _mergedWith; } @@ -35,57 +36,60 @@ namespace Xamarin.Forms } } - ResourceDictionary _mergedInstance; - public ICollection MergedDictionaries { get; private set; } - - public ResourceDictionary() - { - var collection = new ObservableCollection(); - collection.CollectionChanged += MergedDictionaries_CollectionChanged; - MergedDictionaries = collection; + ICollection _mergedDictionaries; + public ICollection MergedDictionaries { + get { + if (_mergedDictionaries == null) { + var col = new ObservableCollection(); + col.CollectionChanged += MergedDictionaries_CollectionChanged; + _mergedDictionaries = col; + } + return _mergedDictionaries; + } } + IList _collectionTrack; + void MergedDictionaries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { - // Movement of items doesn't affect monitoring of events + // Move() isn't exposed by ICollection if (e.Action == NotifyCollectionChangedAction.Move) return; + _collectionTrack = _collectionTrack ?? new List(); + // Collection has been cleared + if (e.Action == NotifyCollectionChangedAction.Reset) { + foreach (var dictionary in _collectionTrack) + dictionary.ValuesChanged -= Item_ValuesChanged; + + _collectionTrack.Clear(); + return; + } + // New Items - var newItems = e.NewItems?.Cast(); - if (newItems != null) + if (e.NewItems != null) { - foreach (var item in newItems) + foreach (var item in e.NewItems) { - _collectionTrack.Add(item); - item.ValuesChanged += Item_ValuesChanged; + var rd = (ResourceDictionary)item; + _collectionTrack.Add(rd); + rd.ValuesChanged += Item_ValuesChanged; + OnValuesChanged(rd.ToArray()); } - - if (newItems.Count() > 0) - OnValuesChanged(newItems.SelectMany(x => x).ToArray()); } // Old Items - var oldItems = e.OldItems?.Cast(); - if (oldItems != null) - foreach (var item in oldItems) + if (e.OldItems != null) + { + foreach (var item in e.OldItems) { - item.ValuesChanged -= Item_ValuesChanged; - _collectionTrack.Remove(item); + var rd = (ResourceDictionary)item; + rd.ValuesChanged -= Item_ValuesChanged; + _collectionTrack.Remove(rd); } - - // Collection has been cleared - if (e.Action == NotifyCollectionChangedAction.Reset) - { - foreach (var dictionary in _collectionTrack) - dictionary.ValuesChanged -= Item_ValuesChanged; - - _collectionTrack.Clear(); } } - IList _collectionTrack = new List(); - void Item_ValuesChanged(object sender, ResourcesChangedEventArgs e) { OnValuesChanged(e.Values.ToArray()); -- cgit v1.2.3