123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.ComponentModel;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace PDF_Office.Helper
- {
- public class ObservableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, INotifyCollectionChanged, INotifyPropertyChanged
- {
- public ObservableDictionary()
- : base()
- { }
- private int _index;
- public event NotifyCollectionChangedEventHandler CollectionChanged;
- public event PropertyChangedEventHandler PropertyChanged;
- public new KeyCollection Keys
- {
- get { return base.Keys; }
- }
- public new ValueCollection Values
- {
- get { return base.Values; }
- }
- public new int Count
- {
- get { return base.Count; }
- }
- public new TValue this[TKey key]
- {
- get { return this.GetValue(key); }
- set { this.SetValue(key, value); }
- }
- public TValue this[int index]
- {
- get { return this.GetIndexValue(index); }
- set { this.SetIndexValue(index, value); }
- }
- public new void Add(TKey key, TValue value)
- {
- base.Add(key, value);
- this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, this.FindPair(key), _index));
- OnPropertyChanged("Keys");
- OnPropertyChanged("Values");
- OnPropertyChanged("Count");
- }
- public new void Clear()
- {
- base.Clear();
- this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
- OnPropertyChanged("Keys");
- OnPropertyChanged("Values");
- OnPropertyChanged("Count");
- }
- public new bool Remove(TKey key)
- {
- var pair = this.FindPair(key);
- if (base.Remove(key))
- {
- this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, pair, _index));
- OnPropertyChanged("Keys");
- OnPropertyChanged("Values");
- OnPropertyChanged("Count");
- return true;
- }
- return false;
- }
- protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
- {
- if (this.CollectionChanged != null)
- {
- this.CollectionChanged(this, e);
- }
- }
- protected void OnPropertyChanged(string propertyName)
- {
- if (this.PropertyChanged != null)
- {
- this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
- }
- }
- #region private method
- private TValue GetIndexValue(int index)
- {
- for (int i = 0; i < this.Count; i++)
- {
- if (i == index)
- {
- var pair = this.ElementAt(i);
- return pair.Value;
- }
- }
- return default(TValue);
- }
- private void SetIndexValue(int index, TValue value)
- {
- try
- {
- var pair = this.ElementAtOrDefault(index);
- SetValue(pair.Key, value);
- }
- catch (Exception)
- {
- }
- }
- private TValue GetValue(TKey key)
- {
- if (base.ContainsKey(key))
- {
- return base[key];
- }
- else
- {
- return default(TValue);
- }
- }
- private void SetValue(TKey key, TValue value)
- {
- if (base.ContainsKey(key))
- {
- var pair = this.FindPair(key);
- int index = _index;
- base[key] = value;
- var newpair = this.FindPair(key);
- this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, newpair, pair, index));
- OnPropertyChanged("Values");
- OnPropertyChanged("Item[]");
- }
- else
- {
- this.Add(key, value);
- }
- }
- private KeyValuePair<TKey, TValue> FindPair(TKey key)
- {
- _index = 0;
- foreach (var item in this)
- {
- if (item.Key.Equals(key))
- {
- return item;
- }
- _index++;
- }
- return default(KeyValuePair<TKey, TValue>);
- }
- private int IndexOf(TKey key)
- {
- int index = 0;
- foreach (var item in this)
- {
- if (item.Key.Equals(key))
- {
- return index;
- }
- index++;
- }
- return -1;
- }
- #endregion
- }
- }
|