2010-11-29 3 views
6

Возможно ли изменить размер коллекции Observable или ограничить максимальное количество предметов коллекции? У меня есть ObservableCollection как свойство в View Model (с использованием шаблона MVVM).Как изменить размер ObservableCollection?

Вид привязывается к коллекции, и я попытался взломать решение, предоставив обработчик событий, который выполняется при возникновении события 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, потому что ему не нравится то, что я изменить коллекцию во время CollectionChanged мероприятия. Что мне делать, чтобы размер моей коллекции соответствовал?

Решение: Саймон Mourier спросил, смогу ли я создать новую коллекцию, полученную из ObservableCollection<T> и переопределить InsertItem() и то только то, что я сделал, чтобы иметь автоматическое изменение размера типа ObservableCollection.

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 2010-11-29 16:22:11

+0

Ваша идея сработала, просто жаль, что вы не уточнили бы больше. В любом случае, я добавляю свое решение к моему вопросу. Спасибо за помощь. – jlafay 2010-11-29 17:03:10

3

Вы можете катить свой собственный класс коллекции, который реализует INotifyCollectionChanged и INotifyPropertyChanged. Вы можете сделать это довольно легко, используя 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); 
    } 
} 
Смежные вопросы