Rumah pembangunan bahagian belakang Tutorial C#.Net WPF核心的技术--数据绑定

WPF核心的技术--数据绑定

Jun 23, 2017 pm 04:04 PM
kamus berkumpul

WPF最核心的技术优势之一就是数据绑定。数据绑定,可以通过对数据的操作来更新界面。

数据绑定最经常用到的是ObservableCollection 和 Dictionary 这两个类。

ObservableCollection表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知,可以通过更新集合数据来更新界面显示。

Dictionary字典类,检索和数据操作性能极性,所以一些配置项的集合都使用它来保存。

因此,大家就想到的,有没有ObservableCollection和Dictionary相结合的类呢,于是就形成的ObservableDictionary类。

网上有很多版本的ObservableDictionary类,据我了解到的,最早且最经典的就是Dr.WPF里面的ItemsControl to a dictionary,其他的版本多数是参考这个来修改的(不对的那就是我孤陋寡闻了)。

今天我提供的这个版本,也是参考了网上的其他版本和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
Salin selepas log masuk

大家细心点就会发现,这里继承的接口和Dictionary所继承的大部分相同,只是多了INotifyCollectionChanged, INotifyPropertyChanged

于是,今天我提供的版本,就直接继承于Dictionary和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

    }
Salin selepas log masuk

扩展方面,大家可以以Dr.WPF版本来修改,那个更加有技术含量和可扩展性更强!

 

Atas ialah kandungan terperinci WPF核心的技术--数据绑定. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Program Python untuk mendapatkan elemen pertama dan terakhir dalam kamus Program Python untuk mendapatkan elemen pertama dan terakhir dalam kamus Sep 07, 2023 pm 05:01 PM

Python ialah bahasa pengaturcaraan peringkat tinggi yang ditafsirkan, berorientasikan objek, dengan semantik dinamik. Dibangunkan oleh GudioVanRossum pada tahun 1991. Ia menyokong pelbagai paradigma pengaturcaraan, termasuk pengaturcaraan berstruktur, berorientasikan objek dan berfungsi. Sebelum kita menyelami topik ini, mari kita semak semula konsep asas yang berkaitan dengan soalan yang kami sediakan. Kamus ialah set item yang unik, boleh ubah dan teratur. Pendakap kerinting digunakan semasa menulis kamus, dan ia mengandungi kunci dan nilai: nama kunci boleh digunakan untuk merujuk kepada objek kamus. Nilai data disimpan dalam kamus dalam bentuk pasangan kunci:nilai. Maksud tertib dan tidak tersusun Apabila kita mengatakan kamus itu tersusun, maksudnya kandungannya mempunyai susunan tertentu dan tidak berubah. Item yang tidak dipesan tidak mempunyai pesanan yang jelas dan oleh itu tidak boleh digunakan

Kunci kamus kosong tidak betul: Bagaimana untuk menyelesaikan ralat kunci kamus Python? Kunci kamus kosong tidak betul: Bagaimana untuk menyelesaikan ralat kunci kamus Python? Jun 24, 2023 pm 03:03 PM

Kamus dalam Python ialah struktur data yang fleksibel dan berkuasa yang boleh menyimpan pasangan nilai kunci dan mempunyai fungsi carian dan sisipan pantas. Walau bagaimanapun, jika anda tidak berhati-hati dengan pasangan nilai kunci kamus, anda mungkin menghadapi masalah kekunci kamus kosong. Masalah ini sering menyebabkan kod ranap atau mengeluarkan hasil yang tidak dijangka. Artikel ini akan memperkenalkan dua kaedah untuk menyelesaikan ralat kunci kamus kosong dalam Python. Kaedah 1: Gunakan penyataan jika untuk menghalang kekunci kamus kosong, kamus Python tidak boleh mempunyai kunci pendua, jika tidak pasangan nilai kunci sebelumnya akan ditimpa. Apabila nilai kunci kamus kosong

Mengapakah sukar untuk melaksanakan fungsi seperti koleksi dalam bahasa Go? Mengapakah sukar untuk melaksanakan fungsi seperti koleksi dalam bahasa Go? Mar 24, 2024 am 11:57 AM

Sukar untuk melaksanakan fungsi seperti koleksi dalam bahasa Go, yang merupakan masalah yang menyusahkan ramai pembangun. Berbanding dengan bahasa pengaturcaraan lain seperti Python atau Java, bahasa Go tidak mempunyai jenis koleksi terbina dalam, seperti set, peta, dll., yang membawa beberapa cabaran kepada pembangun apabila melaksanakan fungsi pengumpulan. Mula-mula, mari kita lihat mengapa sukar untuk melaksanakan fungsi seperti koleksi secara langsung dalam bahasa Go. Dalam bahasa Go, struktur data yang paling biasa digunakan ialah hirisan dan peta Mereka boleh melengkapkan fungsi seperti koleksi, tetapi

Bagaimana untuk mendapatkan kunci seterusnya dalam kamus dalam Python? Bagaimana untuk mendapatkan kunci seterusnya dalam kamus dalam Python? Aug 28, 2023 pm 11:45 PM

Kamus ialah jenis data yang berkuasa dalam Python. Ia terdiri daripada pasangan nilai kunci. Operasi carian, penambahan dan lain-lain boleh diselesaikan dengan cekap melalui jenis data ini. Walaupun mengakses nilai dalam kamus adalah mudah, mungkin terdapat situasi di mana anda perlu mencari kunci seterusnya dalam kamus. Python menyediakan beberapa cara untuk mencapai ini, bergantung pada keperluan khusus anda. Dalam artikel ini, kami akan meneroka cara yang berbeza untuk mendapatkan kunci seterusnya dalam kamus dalam Python. Menggunakan kunci dan kaedah indeks kamus adalah koleksi tidak tertib dalam Python. Oleh itu, kita perlu menukar kunci ke dalam bentuk yang disusun terlebih dahulu. Mula-mula kita boleh menambahkan semua kunci dalam bentuk senarai. Seterusnya, kita boleh mencari kunci seterusnya dengan mengindeks senarai. Dengan bantuan kunci kita juga boleh

Bagaimana untuk mengoptimumkan prestasi pengisihan koleksi Java Bagaimana untuk mengoptimumkan prestasi pengisihan koleksi Java Jun 30, 2023 am 10:43 AM

Java ialah bahasa pengaturcaraan yang berkuasa yang digunakan secara meluas dalam pelbagai jenis pembangunan perisian. Dalam pembangunan Java, senario yang sering melibatkan pengisihan koleksi terlibat. Walau bagaimanapun, jika pengoptimuman prestasi tidak dilakukan untuk pengisihan koleksi, kecekapan pelaksanaan program mungkin berkurangan. Artikel ini akan meneroka cara mengoptimumkan prestasi pengisihan koleksi Java. 1. Pilih kelas koleksi yang sesuai Di Java, terdapat banyak kelas koleksi yang boleh digunakan untuk menyusun, seperti ArrayList, LinkedList, TreeSet, dll. Kelas koleksi berbeza masuk

Kamus permulaan program C++ Kamus permulaan program C++ Sep 09, 2023 pm 07:01 PM

C++ berbeza daripada Python dari segi kamus dengan nama yang sama, tetapi ia mempunyai struktur data yang sama dengan fungsi yang serupa. C++ menyokong pemetaan, yang boleh digunakan dalam kelas STL std::map. Objek peta mengandungi sepasang nilai dalam setiap entri, satu adalah nilai utama dan satu lagi adalah nilai peta. Nilai utama digunakan untuk mencari dan mengenal pasti secara unik entri dalam peta. Walaupun nilai yang dipetakan tidak semestinya unik, nilai utama mestilah sentiasa unik dalam peta. Mari kita lihat cara menggunakan pemetaan. Mula-mula, mari lihat cara untuk menentukan struktur data yang dipetakan dalam C++. Sintaks #includemap<data_type1,data_type2>myMap Mari kita ambil contoh untuk melihat cara melakukan ini − Contoh #incl

Program Python untuk memadam nilai nol dalam kamus sebagai contoh Program Python untuk memadam nilai nol dalam kamus sebagai contoh Sep 03, 2023 pm 04:45 PM

Kamus dikenali sebagai jenis data pengumpulan. Mereka menyimpan data dalam bentuk pasangan nilai kunci. Ia disusun dan boleh berubah, iaitu mengikut susunan tertentu dan diindeks. Kita boleh menukar nilai kunci supaya ia boleh dimanipulasi atau diubah. Kamus tidak menyokong pertindihan data. Setiap kunci boleh mempunyai berbilang nilai yang dikaitkan dengannya, tetapi satu nilai tidak boleh mempunyai berbilang kunci. Kita boleh melakukan banyak operasi menggunakan kamus. Seluruh mekanisme bergantung pada nilai yang disimpan. Dalam artikel ini, kami akan membincangkan teknik yang boleh anda gunakan untuk mengalih keluar "nilai nol" daripada kamus. Sebelum memulakan operasi utama, kita mesti mempunyai pemahaman yang mendalam tentang pengendalian nilai dalam kamus. Mari kita ambil gambaran ringkas artikel ini. Artikel ini dibahagikan kepada dua bahagian - Bahagian 1 akan memberi tumpuan kepada konsep "nilai nol" dan kepentingannya. Dalam bahagian ke-2

Koleksi serentak dan isu keselamatan benang dalam C# Koleksi serentak dan isu keselamatan benang dalam C# Oct 09, 2023 pm 10:49 PM

Pengumpulan serentak biasa dan isu keselamatan benang dalam C# Dalam pengaturcaraan C#, pengendalian operasi serentak adalah keperluan yang sangat biasa. Isu keselamatan benang timbul apabila berbilang benang mengakses dan mengubah suai data yang sama pada masa yang sama. Untuk menyelesaikan masalah ini, C# menyediakan beberapa pengumpulan serentak dan mekanisme keselamatan benang. Artikel ini akan memperkenalkan koleksi serentak biasa dalam C# dan cara menangani isu keselamatan benang, dan memberikan contoh kod khusus. Koleksi serentak 1.1ConcurrentDictionaryConcurrentDictio

See all articles