WPF Combobox绑定Dictionary / ObservableDictionary

  • 一、WPFcombobox绑定dictionary
  • 二、ObservableDictionary
  • 一、WPFcombobox绑定dictionary

    ViewModel中存在以下字典数据,要将其绑定到xaml的Combox中

     private Dictionary<long,string> _MusicList=
       					  new Dictionary<long, string> {
      					     { 3778678, "云音乐热歌榜" },
        					 { 2248307886, "抖音热歌" },
        					 { 3779629, "云音乐新歌榜" },
       						 { 4395559, "华语金曲榜" },
       						 { 64016, "中国TOP排行榜(内地榜)" },
      					     { 112504, "中国TOP排行榜(港台榜)" },
       						 { 19723756, "云音乐飙升榜" },
      						 { 2884035, "网易原创歌曲榜" },
     public Dictionary<long,string> MusicList
         get { return this._MusicList; }
             this._MusicList = value;
             RaisePropertyChanged(() => MusicList);
    

    字典的绑定

    <ComboBox Grid.Row="1" ItemsSource="{Binding MusicList}" DisplayMemberPath="Value" SelectedValuePath = "Key"></ComboBox> 二、ObservableDictionary
    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方法
        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)
                var pair = this.ElementAtOrDefault(index);
                SetValue(pair.Key, value);                
            catch (Exception)
        private TValue GetValue(TKey key)
            if (base.ContainsKey(key))
                return base[key];
                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[]");
                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