2010-11-29 6 views
6

Observable Collection의 크기를 조정하거나 최대 수집 항목 수를 제한 할 수 있습니까? ObservableCollection을 MVVM 패턴을 사용하는 View Model의 속성으로 사용하고 있습니다.ObservableCollection의 크기를 조정하는 방법?

보기가 컬렉션에 바인딩되고 CollectionChanged 이벤트가 발생할 때 실행되는 이벤트 처리기를 제공하여 솔루션을 해킹하려고 시도했습니다. 이벤트 처리기에서 필자는 필요에 따라 컬렉션의 맨 위에서 많은 항목을 제거하여 컬렉션을 잘라 냈습니다. 그것은 내가 CollectionChanged 이벤트 기간 동안 컬렉션을 변경 사실을 좋아하지 않기 때문에

ObservableCollection<string> items = new ObservableCollection<string>(); 
items.CollectionChanged += new NotifyCollectionChangedEventHandler(Items_Changed); 

void Items_Changed(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if(items.Count > 10) 
    { 
     int trimCount = items.Count - 10; 
     for(int i = 0; i < trimCount; i++) 
     { 
      items.Remove(items[0]); 
     } 
    } 
} 

이 이벤트 핸들러는 InvalidOperationException를 얻을 수 있습니다. 내 수집 물의 크기를 적절하게 유지하려면 어떻게해야합니까?

해결책 : 나는 ObservableCollection<T>에서 파생 된 새 컬렉션을 만들고 내가 자동 크기 조정 ObservableCollection에 유형을 가지고 그랬던 것 InsertItem()하고 그게 전부를 대체 할 수 있다면 사이먼 Mourier 물었다.

public class MyCollection<T> : ObservableCollection<T> 
{ 
    public int MaxCollectionSize { get; set; } 

    public MyCollection(int maxCollectionSize = 0) : base() 
    { 
     MaxCollectionSize = maxCollectionsize; 
    } 

    protected override void InsertItem(int index, T item) 
    { 
     base.InsertItem(index, item); 

     if(MaxCollectionSize > 0 && MaxCollectionSize < Count) 
     { 
      int trimCount = Count - MaxCollectionSize; 
      for(int i=0; i<trimCount; i++) 
      { 
       RemoveAt(0); 
      } 
     } 
    } 
} 

답변

8

ObservableCollection 클래스를 파생시키고 InsertItem 메서드를 재정의 할 수 있습니까?

+0

그렇게하는 것이 사소한인가? 나는 대답을 원했고 다른 질문은하지 않았다. – jlafay

+0

당신의 생각은 효과가 있었지만, 더 자세히 설명해 주었으면 좋겠다. 어느 쪽이든, 내 질문에 내 솔루션을 추가하고있다. 도와 주셔서 감사합니다. – jlafay

+0

다행이었습니다. 어쨌든 잘 했어. –

3

INotifyCollectionChangedINotifyPropertyChanged을 구현하는 고유 한 컬렉션 클래스를 롤 할 수 있습니다. 자신의 컬렉션 클래스에서 내부적으로 ObservableCollection 을 사용하면 쉽게 처리 할 수 ​​있습니다.

6

대신이 시도 :

public class FixedSizeObservableCollection<T> : ObservableCollection<T> 
{ 
    private readonly int maxSize; 
    public FixedSizeObservableCollection(int maxSize) 
    { 
     this.maxSize = maxSize; 
    } 

    protected override void InsertItem(int index, T item) 
    { 
     if (Count == maxSize) 
      return; // or throw exception 
     base.InsertItem(index, item); 
    } 
} 
+1

Simon이 제안한대로 나 자신과 함께가는 것을 끝내었다. – jlafay

관련 문제