欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何使用WPF的數(shù)據(jù)綁定

如何使用WPF的數(shù)據(jù)綁定?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

江北網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),江北網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為江北上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的江北做網(wǎng)站的公司定做!

 WPF最核心的技術(shù)優(yōu)勢之一就是數(shù)據(jù)綁定。數(shù)據(jù)綁定,可以通過對數(shù)據(jù)的操作來更新界面。

數(shù)據(jù)綁定最經(jīng)常用到的是ObservableCollection<T> 和 Dictionary<T, T> 這兩個類。

ObservableCollection表示一個動態(tài)數(shù)據(jù)集合,在添加項、移除項或刷新整個列表時,此集合將提供通知,可以通過更新集合數(shù)據(jù)來更新界面顯示。

Dictionary字典類,檢索和數(shù)據(jù)操作性能極性,所以一些配置項的集合都使用它來保存。

因此,大家就想到的,有沒有ObservableCollection和Dictionary相結(jié)合的類呢,于是就形成的ObservableDictionary類。

網(wǎng)上有很多版本的ObservableDictionary類,據(jù)我了解到的,最早且最經(jīng)典的就是Dr.WPF里面的ItemsControl to a dictionary,其他的版本多數(shù)是參考這個來修改的(不對的那就是我孤陋寡聞了)。

今天我提供的這個版本,也是參考了網(wǎng)上的其他版本和Dr.WPF里的。

Dr.WPF里的定義是這樣的:

public class ObservableDictionary <TKey, TValue> :
        IDictionary<TKey, TValue>,
        ICollection<KeyValuePair<TKey, TValue>>,
        IEnumerable<KeyValuePair<TKey, TValue>>,
        IDictionary,
        ICollection,
        IEnumerable,
        ISerializable,
        IDeserializationCallback,
        INotifyCollectionChanged,
        INotifyPropertyChanged

大家細心點就會發(fā)現(xiàn),這里繼承的接口和Dictionary<TKey, TValue>所繼承的大部分相同,只是多了INotifyCollectionChanged, INotifyPropertyChanged

于是,今天我提供的版本,就直接繼承于Dictionary<TKey, TValue>和INotifyCollectionChanged, INotifyPropertyChanged。

本人測試過,無BUG,性能也極佳,下面上代碼:

    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)
        {
            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

    }

看完上述內(nèi)容,你們掌握如何使用WPF的數(shù)據(jù)綁定的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

標題名稱:如何使用WPF的數(shù)據(jù)綁定
轉(zhuǎn)載來源:http://www.aaarwkj.com/article26/igdjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站網(wǎng)站導(dǎo)航、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)
国产在线视频不卡一线路| 欧美日韩伦理片在线观看| 免费在线一区二区av| 夫妻性生活在线视频一级片 | 中文字幕在线五月婷婷| 久久三级中文欧大战字幕| 91久久一区二区秋霞免费| 国产精品无卡无在线播放| 在线一区二区三区成人观看| 男人天堂av在线资源| 久久精品国产亚洲av一| 亚洲欧美日韩精品成人| 国产精品天天影视久久| 亚洲成av人在线播放| 高颜值美女后入内射视频| 成年午夜福利片在线观看| 成年人片免费在线观看| 亚洲国产精品自拍视频| 午夜香蕉av一区二区三区| 六月综合激情丁香婷婷色| 不卡二卡三卡四卡精品| 男人的天堂在线观看黄片| 欧美色精品人妻在线最新| 十八禁真人无摭挡观看| 欧美亚洲精品一区在线观看| 免费女性啪啪无遮挡网站| 成人免费视频观看国产| 夜夜操狠狠操天天摸| 欧美精品一区二区三区色| 老熟妇仑乱换频一区二区| 人妻日韩字幕一区二区| 国产精品久久99真精品| 高h视频在线播放观看| 97在线视频这里只有精品| 香蕉视频欧美久久精品| 亚洲综合色日本日b网| 亚洲风情亚av在线播放| 蜜臀在线免费观看黄片视频| 欧美黄片不用下载在线观看| 免费观看国产性生活片| 日本国产精品久久一线|