2010-11-29 10 views
6

¿Es posible cambiar el tamaño de una colección observable o quizás restringir la cantidad máxima de elementos de colección? Tengo una ObservableCollection como propiedad en un modelo de vista (usando el patrón MVVM).Cómo cambiar el tamaño de ObservableCollection?

La vista se une a la colección y he intentado hackear una solución proporcionando un controlador de eventos que se ejecuta cuando ocurre un evento CollectionChanged. En el controlador de eventos, recorté la colección quitando tantos elementos de la parte superior de la colección como sea necesario.

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]); 
     } 
    } 
} 

Este controlador de eventos, se obtiene una InvalidOperationException porque no le gusta el hecho de que altero la colección durante un evento CollectionChanged. ¿Qué debo hacer para mantener mi colección del tamaño adecuado?

Solución: Simon Mourier preguntó si podía crear una nueva colección derivado de ObservableCollection<T> y anular InsertItem() y eso es justo lo que hizo a tener un tipo de cambio de tamaño automático 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); 
      } 
     } 
    } 
} 

Respuesta

8

¿Puede derivar la clase ObservableCollection y anular el método InsertItem?

+0

Es trivial para hacerlo? Esperaba una respuesta y no otra pregunta :) – jlafay

+0

Tu idea funcionó, solo desearía haber elaborado más. De cualquier manera, estoy agregando mi solución a mi pregunta. Gracias por la ayuda. – jlafay

+0

Me alegro de que funcionó. Buen trabajo de todos modos :) –

3

Puede rodar su propia clase de colección que implementa INotifyCollectionChanged y INotifyPropertyChanged. Puede hacerlo con bastante facilidad utilizando ObservableCollection internamente en su propia clase de colección.

6

Tal vez puedas probar:

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

Eso es más o menos lo que terminé yendo conmigo como lo sugirió Simon. – jlafay

Cuestiones relacionadas