백엔드 개발 C#.Net 튜토리얼 WPF 데이터 바인딩의 핵심 기술

WPF 데이터 바인딩의 핵심 기술

Jun 23, 2017 pm 04:04 PM
사전 모으다

WPF의 핵심 기술 장점 중 하나는 데이터 바인딩입니다. 데이터 바인딩은 데이터에 대한 작업을 통해 인터페이스를 업데이트할 수 있습니다.

데이터 바인딩에 가장 일반적으로 사용되는 클래스는 ObservableCollection 및 Dictionary입니다.

ObservableCollection은 동적 데이터 컬렉션을 나타냅니다. 이 컬렉션은 항목이 추가되거나 항목이 제거되거나 전체 목록이 새로 고쳐질 때 알림을 제공합니다. 컬렉션 데이터를 업데이트하여 인터페이스 표시를 업데이트할 수 있습니다.

Dictionary 사전 클래스는 검색 및 데이터 연산 성능이 매우 낮기 때문에 일부 구성 항목 모음을 이를 사용하여 저장합니다.

그래서 다들 ObservableCollection과 Dictionary를 결합한 클래스가 있을까 고민하다가 ObservableDictionary 클래스가 탄생하게 되었습니다.

내가 아는 한 ObservableDictionary 클래스의 버전은 Dr.WPF의 사전에 대한 ItemsControl입니다. 대부분의 다른 버전은 이를 참조하여 수정됩니다. , 나는 무지하다) ).

오늘 제가 제공하는 버전은 인터넷에 있는 다른 버전과 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
로그인 후 복사

자세히 살펴보면 여기에 상속된 인터페이스는 다음을 추가한 것을 제외하면 Dictionary에서 상속한 인터페이스와 거의 동일하다는 것을 알 수 있습니다. INotifyCollectionChanged, INotifyPropertyChanged

따라서 제가 오늘 제공하는 버전은 Dictionary 및 INotifyCollectionChanged, INotifyPropertyChanged를 직접 상속합니다.

테스트해본 결과 버그도 없고 성능도 뛰어납니다. 코드는 아래와 같습니다.

    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

    }
로그인 후 복사

확장 측면에서는 더 기술적이고 확장성이 뛰어난 Dr.WPF 버전으로 수정할 수 있습니다. !

위 내용은 WPF 데이터 바인딩의 핵심 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

사전의 첫 번째 요소와 마지막 요소를 가져오는 Python 프로그램 사전의 첫 번째 요소와 마지막 요소를 가져오는 Python 프로그램 Sep 07, 2023 pm 05:01 PM

Python은 동적 의미 체계를 갖춘 해석된 객체 지향 고급 프로그래밍 언어입니다. 1991년 GudioVanRossum이 개발했습니다. 구조적 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍을 포함한 다양한 프로그래밍 패러다임을 지원합니다. 이 주제에 대해 자세히 알아보기 전에 우리가 제공하는 질문과 관련된 기본 개념을 검토해 보겠습니다. 사전은 고유하고 변경 가능하며 순서가 지정된 항목 집합입니다. 중괄호는 사전을 작성할 때 사용되며 여기에는 키와 값이 포함됩니다. 키 이름은 사전 개체를 참조하는 데 사용할 수 있습니다. 데이터 값은 키:값 쌍의 형태로 사전에 저장됩니다. 순서가 있는 것과 순서가 없는 것의 의미 사전이 순서가 있다고 말할 때, 그 내용은 일정한 순서를 가지며 변하지 않는다는 것을 의미합니다. 주문되지 않은 항목은 명확한 주문이 없으므로 사용할 수 없습니다.

빈 사전 키가 잘못되었습니다. Python의 사전 키 오류를 해결하는 방법은 무엇입니까? 빈 사전 키가 잘못되었습니다. Python의 사전 키 오류를 해결하는 방법은 무엇입니까? Jun 24, 2023 pm 03:03 PM

Python의 사전은 키-값 쌍을 저장할 수 있고 빠른 검색 및 삽입 기능을 갖춘 유연하고 강력한 데이터 구조입니다. 그러나 사전 키-값 쌍에 주의하지 않으면 빈 사전 키 문제가 발생할 수 있습니다. 이 문제로 인해 코드가 충돌하거나 예상치 못한 결과가 출력되는 경우가 많습니다. 이 기사에서는 Python에서 빈 사전 키 오류를 해결하는 두 가지 방법을 소개합니다. 방법 1: 빈 사전 키를 방지하려면 if 문을 사용하세요. Python 사전은 중복 키를 가질 수 없습니다. 그렇지 않으면 이전 키-값 쌍을 덮어쓰게 됩니다. 사전 키 값이 비어 있는 경우

Go 언어에서 컬렉션과 같은 기능을 구현하는 것이 왜 어려운가요? Go 언어에서 컬렉션과 같은 기능을 구현하는 것이 왜 어려운가요? Mar 24, 2024 am 11:57 AM

Go 언어에서는 컬렉션과 같은 기능을 구현하기가 어렵기 때문에 많은 개발자들이 고민하고 있습니다. Python이나 Java와 같은 다른 프로그래밍 언어와 비교할 때 Go 언어에는 집합, 맵 등과 같은 컬렉션 유형이 내장되어 있지 않아 개발자가 컬렉션 기능을 구현할 때 몇 가지 어려움을 겪습니다. 먼저 Go 언어에서 컬렉션과 유사한 기능을 직접 구현하는 것이 왜 어려운지 살펴보겠습니다. Go 언어에서 가장 일반적으로 사용되는 데이터 구조는 컬렉션과 유사한 기능을 완성할 수 있지만

Python에서 사전의 다음 키를 얻는 방법은 무엇입니까? Python에서 사전의 다음 키를 얻는 방법은 무엇입니까? Aug 28, 2023 pm 11:45 PM

사전은 Python의 강력한 데이터 유형입니다. 키-값 쌍으로 구성됩니다. 이 데이터 유형을 통해 검색, 추가 및 기타 작업을 효율적으로 완료할 수 있습니다. 사전의 값에 액세스하는 것은 간단하지만 사전에서 다음 키를 찾아야 하는 상황이 있을 수 있습니다. Python은 특정 요구 사항에 따라 이를 달성할 수 있는 여러 가지 방법을 제공합니다. 이 기사에서는 Python 사전에서 다음 키를 얻는 다양한 방법을 살펴보겠습니다. 키와 인덱스 메소드를 사용하는 사전은 Python에서 순서가 지정되지 않은 컬렉션입니다. 따라서 먼저 키를 정렬된 형식으로 변환해야 합니다. 먼저 모든 키를 목록 형식으로 추가할 수 있습니다. 다음으로 목록을 인덱싱하여 다음 키를 찾을 수 있습니다. 열쇠의 도움으로 우리는 또한

Java 컬렉션 정렬 성능을 최적화하는 방법 Java 컬렉션 정렬 성능을 최적화하는 방법 Jun 30, 2023 am 10:43 AM

Java는 다양한 유형의 소프트웨어 개발에 널리 사용되는 강력한 프로그래밍 언어입니다. Java 개발에는 종종 컬렉션 정렬과 관련된 시나리오가 포함됩니다. 그러나 컬렉션 정렬에 대한 성능 최적화를 수행하지 않으면 프로그램의 실행 효율성이 저하될 수 있습니다. 이 기사에서는 Java 컬렉션 정렬 성능을 최적화하는 방법을 살펴보겠습니다. 1. 적절한 컬렉션 클래스 선택 Java에는 ArrayList, LinkedList, TreeSet 등과 같이 정렬에 사용할 수 있는 컬렉션 클래스가 많이 있습니다. 다양한 컬렉션 클래스가 있습니다.

C++ 프로그램 초기화 사전 C++ 프로그램 초기화 사전 Sep 09, 2023 pm 07:01 PM

C++는 동일한 이름을 가진 사전이라는 점에서 Python과 다르지만 유사한 기능을 가진 동일한 데이터 구조를 갖습니다. C++는 STL 클래스 std::map에서 사용할 수 있는 매핑을 지원합니다. 지도 객체에는 각 항목에 한 쌍의 값이 포함되어 있는데, 하나는 키 값이고 다른 하나는 지도 값입니다. 키 값은 맵의 항목을 검색하고 고유하게 식별하는 데 사용됩니다. 매핑된 값은 반드시 고유할 필요는 없지만 키 값은 맵에서 항상 고유해야 합니다. 매핑을 사용하는 방법을 살펴보겠습니다. 먼저 C++에서 매핑된 데이터 구조를 정의하는 방법을 살펴보겠습니다. 구문 #includemap<data_type1,data_type2>myMap 이를 수행하는 방법을 알아보기 위해 예를 들어 보겠습니다. 예 #incl;

예를 들어 사전에서 null 값을 삭제하는 Python 프로그램 예를 들어 사전에서 null 값을 삭제하는 Python 프로그램 Sep 03, 2023 pm 04:45 PM

사전은 컬렉션 데이터 유형으로 알려져 있습니다. 키-값 쌍의 형태로 데이터를 저장합니다. 순서가 지정되고 변경 가능합니다. 즉, 특정 순서를 따르고 색인이 생성됩니다. 키 값을 변경하여 조작 또는 변경이 가능하도록 할 수 있습니다. 사전은 데이터 복제를 지원하지 않습니다. 각 키에는 연결된 여러 값이 있을 수 있지만 단일 값에는 여러 키가 있을 수 없습니다. 사전을 사용하여 많은 작업을 수행할 수 있습니다. 전체 메커니즘은 저장된 값에 따라 달라집니다. 이 기사에서는 사전에서 "널 값"을 제거하는 데 사용할 수 있는 기술에 대해 설명합니다. 주요 작업을 시작하기 전에 사전의 값 처리에 대한 심층적인 이해가 필요합니다. 이 기사에 대한 간략한 개요를 살펴보겠습니다. 이 기사는 두 부분으로 나누어져 있습니다. 1부에서는 "널 값"의 개념과 그 중요성에 중점을 둘 것입니다. 2부에서는

C#의 일반적인 동시 수집 및 스레드 안전 문제 C#의 일반적인 동시 수집 및 스레드 안전 문제 Oct 09, 2023 pm 10:49 PM

C#의 일반적인 동시 컬렉션 및 스레드 안전 문제 C# 프로그래밍에서 동시 작업 처리는 매우 일반적인 요구 사항입니다. 여러 스레드가 동시에 동일한 데이터에 액세스하고 수정할 때 스레드 안전 문제가 발생합니다. 이 문제를 해결하기 위해 C#에서는 몇 가지 동시 수집 및 스레드 안전 메커니즘을 제공합니다. 이 문서에서는 C#의 일반적인 동시 컬렉션과 스레드 안전 문제를 처리하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 동시 수집 1.1ConcurrentDictionaryConcurrentDictio

See all articles