programing

.net에서 관찰 가능한 컬렉션은 어떤 용도로 사용됩니까?

muds 2023. 5. 1. 22:07
반응형

.net에서 관찰 가능한 컬렉션은 어떤 용도로 사용됩니까?

.net에서 관찰 가능한 컬렉션은 어떤 용도로 사용됩니까?

관찰 가능한 컬렉션은 컬렉션 외부의 코드가 컬렉션 변경(추가, 이동, 제거)이 발생할 때 이를 인식할 수 있도록 하는 컬렉션입니다.WPF 및 Silverlight에서 많이 사용되지만 이에 국한되지 않습니다.코드는 수집이 변경된 시기를 확인하기 위해 이벤트 핸들러를 추가한 다음 이벤트 핸들러를 통해 대응하여 추가 처리를 수행할 수 있습니다.UI를 변경하거나 다른 작업을 수행할 수 있습니다.

아래 코드는 클래스에 핸들러를 연결한 다음 이벤트 인수를 사용하여 변경 사항에 대응하는 방법을 보여줍니다.WPF에는 이미 UI 새로 고침과 같은 많은 작업이 포함되어 있으므로 관찰 가능한 컬렉션을 사용할 때 무료로 사용할 수 있습니다.

class Handler
{
    private ObservableCollection<string> collection;

    public Handler()
    {
        collection = new ObservableCollection<string>();
        collection.CollectionChanged += HandleChange;
    }

    private void HandleChange(object sender, NotifyCollectionChangedEventArgs e)
    {
        foreach (var x in e.NewItems)
        {
            // do something
        }

        foreach (var y in e.OldItems)
        {
            //do something
        }
        if (e.Action == NotifyCollectionChangedAction.Move)
        {
            //do something
        }
    }
}

는 인터페이스를 구현한다는 점을 제외하고는 기본적으로 일반 컬렉션처럼 작동합니다.

따라서 컬렉션이 변경된 시기를 알고 싶을 때 매우 유용합니다.추가/제거되거나 이동된 항목을 사용자에게 알려주는 이벤트가 트리거됩니다.

더 중요한 것은 양식에서 데이터 바인딩을 사용할 때 매우 유용하다는 것입니다.

Pro C# 5.0 및 에서.NET 4.5 프레임워크

ObservableCollection<T> 때 수 합니다.ReadOnlyObservableCollection<T>매우 유사하지만 본질적으로는 읽기 전용입니다.다양한 방식으로 고객과 함께 작업합니다.ObservableCollection<T>는 관련작동니로 작업하는 것과 동일합니다.List<T>이 두 클래스 모두 동일한 코어 인터페이스를 구현한다는 점을 고려할 때.이 원인까니입이를 ?ObservableCollection<T>는 이 가 클스고이클이지것이정라는 입니다.CollectionChanged이 이벤트는 새 항목이 삽입되거나 현재 항목이 제거(또는 재배치)되거나 전체 컬렉션이 수정될 때마다 발생합니다.로 CollectionChanged는 이 에는 "CollectionChanged", "CollectionChanged"입니다.NotifyCollectionChangedEventHandler를 첫 매개 변수로 할 수 , " 대리는객체첫번변사매용수모다하있수호습니메출를할서드이든는로개째를자▁this▁that▁can▁any다▁a,있▁call▁delegate니▁and습▁as이▁method"NotifyCollectionChangedEventArgs사용자 개체와 와이어로 채우는 ()합니다.CollectionChanged 이벤트:

class Program
{
   static void Main(string[] args)
   {
     // Make a collection to observe and add a few Person objects.
     ObservableCollection<Person> people = new ObservableCollection<Person>()
     {
        new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },
        new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },
     };
     // Wire up the CollectionChanged event.
     people.CollectionChanged += people_CollectionChanged;
     // Now add a new item.
     people.Add(new Person("Fred", "Smith", 32));

     // Remove an item.
     people.RemoveAt(0);

     Console.ReadLine();
   }
   static void people_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
   {
       // What was the action that caused the event?
        Console.WriteLine("Action for this event: {0}", e.Action);

        // They removed something. 
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
        {
            Console.WriteLine("Here are the OLD items:");
            foreach (Person p in e.OldItems)
            {
                Console.WriteLine(p.ToString());
            }
            Console.WriteLine();
        }

        // They added something. 
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            // Now show the NEW items that were inserted.
            Console.WriteLine("Here are the NEW items:");
            foreach (Person p in e.NewItems)
            {
                Console.WriteLine(p.ToString());
            }
        }
   }
}

들오는.NotifyCollectionChangedEventArgs는 두 을 정의합니다.OldItems그리고.NewItems그러면 이벤트가 실행되기 전에 현재 컬렉션에 있었던 항목 목록과 변경과 관련된 새 항목이 표시됩니다.그러나 올바른 상황에서만 이러한 목록을 검사할 수 있습니다.항목이 추가, 제거, 재배치 또는 재설정될 때 CollectionChanged 이벤트가 발생할 수 있습니다.이러한 작업 중 이벤트를 트리거한 작업을 검색하려면 NotifyCollectionChangedEventArgs의 작업 속성을 사용할 수 있습니다.은 Action의 구성원 중 하나에 대해 테스트할 수 .NotifyCollectionChangedAction열거:

public enum NotifyCollectionChangedAction
{
Add = 0,
Remove = 1,
Replace = 2,
Move = 3,
Reset = 4,
}

시스템 구성원.

코드 없는 설명

(기억에 도움이 되는) 스토리가 포함된 코드 없이 대답을 원하는 사람들(붐티시):

일반 컬렉션 - 알림 없음

가끔 저는 뉴욕에 가고 제 아내는 저에게 물건을 사달라고 합니다.그래서 저는 쇼핑 리스트를 가지고 갑니다.목록에는 다음과 같은 많은 항목이 있습니다.

  1. 루이비통 핸드백 ($5000)
  2. 클라이브 크리스찬의 임페리얼 마제 향수 ($215,000)
  3. 구찌 선글라스 ($2000)

하하하 글쎄요, 저는 그 물건을 사지 않을 것입니다.그래서 저는 그것들을 지우고 목록에서 제거하고 대신 다음을 추가합니다.

  1. 타이틀리스트 골프공 12개.
  2. 12파운드 볼링공.

그래서 저는 보통 물건 없이 집에 돌아옵니다. 그리고 그녀는 결코 화를 내지 않습니다. 그녀는 제가 목록에서 무엇을 삭제하고 무엇을 추가하는지에 대해 알지 못합니다. 그녀는 아무런 통지도 받지 못합니다.

관찰 가능한 컬렉션 - 변경 시 알림

제가 목록에서 무언가를 제거할 때마다 그녀는 알림을 받습니다.

관찰 가능한 컬렉션은 동일한 방식으로 작동합니다.항목을 추가하거나 제거하면 다른 사용자에게 알립니다.

그리고 그들이 통지를 받으면, 벙커에 들어가거나 도망쳐라!물론 이벤트 핸들러를 통해 결과를 사용자 지정할 수 있습니다.

바보 같은 이야기지만, 이제 그 개념을 기억할 수 있기를 바랍니다.

가장 큰 용도 중 하나는 UI 구성 요소를 하나로 바인딩할 수 있다는 것이며, 컬렉션의 내용이 변경되면 UI 구성 요소가 적절하게 응답합니다.예를 들어 ListView의 항목을 바인딩하는 경우컬렉션을 수정하면 ListView의 내용이 자동으로 업데이트됩니다.

편집: 다음은 MSDN의 샘플 코드입니다. http://msdn.microsoft.com/en-us/library/ms748365.aspx .

C#에서 ListBox를 컬렉션에 후킹하는 것은 다음과 같이 쉽습니다.

listBox.ItemsSource = NameListData;

목록을 정적 리소스로 연결하고 NameItem을 정의하지 않은 경우에도사용자 이름의 ToString()을(를) 재정의할 수 있는 템플리트.예:

public override ToString()
{
    return string.Format("{0} {1}", this.FirstName, this.LastName);
}

대부분 UI에 컬렉션 변경을 알리는 데 사용되는 컬렉션으로, 자동 알림을 지원합니다.

주로 WPF에 사용됨,

여기서 목록 상자와 추가 버튼이 있는 UI가 있다고 가정하고 이 버튼을 클릭하면 유형의 개체가 관찰 가능한 컬렉션에 추가되고 이 컬렉션을 목록 상자의 ItemSource에 바인딩하면 컬렉션에 새 항목을 추가하는 즉시 목록 상자가 자체 업데이트되고 항목이 하나 더 추가됩니다.

class FooObservableCollection : ObservableCollection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        base.Add(index, Foo);

        if (this.CollectionChanged != null)
            this.CollectionChanged(this, new NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Add, item, index);
    }
}

var collection = new FooObservableCollection();
collection.CollectionChanged += CollectionChanged;

collection.Add(new Foo());

void CollectionChanged (object sender, NotifyCollectionChangedEventArgs e)
{
    Foo newItem = e.NewItems.OfType<Foo>().First();
}

관찰 가능한 수집 주의 사항

위에 언급된 (Roohullah Allem)

ObservableCollection 클래스가 고유한 이유는 이 클래스가 CollectionChanged라는 이벤트를 지원하기 때문입니다.

이 점을 명심하세요...에 많은 항목을 추가하는 경우ObservableCollectionUI도 여러 번 업데이트됩니다.이것은 정말로 당신의 UI를 뭉치거나 정지시킬 수 있습니다.해결 방법은 새 목록을 만들고 모든 항목을 추가한 다음 새 목록에 속성을 설정하는 것입니다.UI가 한 번 표시됩니다.다시...이것은 많은 수의 항목을 추가하기 위한 것입니다.

언급URL : https://stackoverflow.com/questions/4279185/what-is-the-use-of-observablecollection-in-net

반응형