¿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);
}
}
}
}
Es trivial para hacerlo? Esperaba una respuesta y no otra pregunta :) – jlafay
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
Me alegro de que funcionó. Buen trabajo de todos modos :) –