using System.Collections.Generic; using System.ComponentModel; using System.Dynamic; namespace JD.Guinness.WPF.Module.Model { public sealed class CustomData : DynamicObject, INotifyPropertyChanged { private readonly Dictionary _values; public IEnumerable> Values => _values; public string this[string key] { get => _values.TryGetValue(key, out string value) ? value : string.Empty; set => _values[key] = value; } public CustomData() { _values = new Dictionary(); } public void Add(IEnumerable> data) { foreach (KeyValuePair pair in data) { this[pair.Key] = pair.Value; } } public void Remove(string key) => _values.Remove(key); public void ChangeKey(string oldKey, string newKey) { if (_values.TryGetValue(oldKey, out string value)) { Remove(oldKey); _values[newKey] = value; } } public override bool TryGetMember(GetMemberBinder binder, out object result) { result = this[binder.Name]; return true; } public override bool TrySetMember(SetMemberBinder binder, object value) { this[binder.Name] = value as string; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(binder.Name)); return true; } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; #endregion } }