diff --git a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs index 1aa239180c..9f2a271092 100644 --- a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs +++ b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs @@ -16,6 +16,7 @@ namespace Avalonia.Collections /// The type of the dictionary key. /// The type of the dictionary value. public class AvaloniaDictionary : IDictionary, + IDictionary, INotifyCollectionChanged, INotifyPropertyChanged { @@ -51,6 +52,18 @@ namespace Avalonia.Collections /// public ICollection Values => _inner.Values; + public bool IsFixedSize => ((IDictionary)_inner).IsFixedSize; + + ICollection IDictionary.Keys => ((IDictionary)_inner).Keys; + + ICollection IDictionary.Values => ((IDictionary)_inner).Values; + + public bool IsSynchronized => ((IDictionary)_inner).IsSynchronized; + + public object SyncRoot => ((IDictionary)_inner).SyncRoot; + + public object this[object key] { get => ((IDictionary)_inner)[key]; set => ((IDictionary)_inner)[key] = value; } + /// /// Gets or sets the named resource. /// @@ -174,6 +187,12 @@ namespace Avalonia.Collections return _inner.GetEnumerator(); } + /// + void ICollection.CopyTo(Array array, int index) + { + ((ICollection)_inner).CopyTo(array, index); + } + /// void ICollection>.Add(KeyValuePair item) { @@ -192,6 +211,30 @@ namespace Avalonia.Collections return Remove(item.Key); } + /// + void IDictionary.Add(object key, object value) + { + Add((TKey)key, (TValue)value); + } + + /// + bool IDictionary.Contains(object key) + { + return ((IDictionary)_inner).Contains(key); + } + + /// + IDictionaryEnumerator IDictionary.GetEnumerator() + { + return ((IDictionary)_inner).GetEnumerator(); + } + + /// + void IDictionary.Remove(object key) + { + Remove((TKey)key); + } + private void NotifyAdd(TKey key, TValue value) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count")); diff --git a/src/Avalonia.Styling/Controls/ResourceDictionary.cs b/src/Avalonia.Styling/Controls/ResourceDictionary.cs index 58dee17775..1e35afa771 100644 --- a/src/Avalonia.Styling/Controls/ResourceDictionary.cs +++ b/src/Avalonia.Styling/Controls/ResourceDictionary.cs @@ -1,92 +1,14 @@ using System; using System.Collections; -using System.Collections.Generic; +using Avalonia.Collections; namespace Avalonia.Controls { /// /// An indexed dictionary of resources. /// - public class ResourceDictionary : IResourceDictionary, IDictionary + public class ResourceDictionary : AvaloniaDictionary, IResourceDictionary, IDictionary { - private Dictionary _inner = new Dictionary(); - - public object this[string key] - { - get { return _inner[key]; } - set { _inner[key] = value; } - } - - public int Count => _inner.Count; - - ICollection IDictionary.Keys => _inner.Keys; - - ICollection IDictionary.Values => _inner.Values; - - bool ICollection>.IsReadOnly => false; - - object IDictionary.this[object key] - { - get { return ((IDictionary)_inner)[key]; } - set { ((IDictionary)_inner)[key] = value; } - } - - ICollection IDictionary.Keys => _inner.Keys; - - ICollection IDictionary.Values => _inner.Values; - - bool ICollection.IsSynchronized => false; - - object ICollection.SyncRoot => ((IDictionary)_inner).SyncRoot; - - bool IDictionary.IsFixedSize => false; - - bool IDictionary.IsReadOnly => false; - - public void Add(string key, object value) => _inner.Add(key, value); - - public void Clear() => _inner.Clear(); - - public bool ContainsKey(string key) => _inner.ContainsKey(key); - - public bool Remove(string key) => _inner.Remove(key); - - public IEnumerator> GetEnumerator() => _inner.GetEnumerator(); - - public bool TryGetValue(string key, out object value) => _inner.TryGetValue(key, out value); - - public bool TryGetResource(string key, out object value) => _inner.TryGetValue(key, out value); - - bool ICollection>.Contains(KeyValuePair item) - { - return ((IDictionary)_inner).Contains(item); - } - - void ICollection>.Add(KeyValuePair item) - { - ((IDictionary)_inner).Add(item); - } - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { - ((IDictionary)_inner).CopyTo(array, arrayIndex); - } - - bool ICollection>.Remove(KeyValuePair item) - { - return ((IDictionary)_inner).Remove(item); - } - - void ICollection.CopyTo(Array array, int index) => ((IDictionary)_inner).CopyTo(array, index); - - IEnumerator IEnumerable.GetEnumerator() => _inner.GetEnumerator(); - - IDictionaryEnumerator IDictionary.GetEnumerator() => ((IDictionary)_inner).GetEnumerator(); - - void IDictionary.Add(object key, object value) => ((IDictionary)_inner).Add(key, value); - - bool IDictionary.Contains(object key) => ((IDictionary)_inner).Contains(key); - - void IDictionary.Remove(object key) => ((IDictionary)_inner).Remove(key); + public bool TryGetResource(string key, out object value) => TryGetValue(key, out value); } }