ObservableCollection
«s имеют colleciton измененное событие, которое проходит пославший его (база сбора), а также ряд аргументов. Вы можете прослушать это событие CollectionChanged
, прослушать только новые предметы и выполнить операцию над элементом.
Если ваша коллекция представляет собой список объектов, на которые имеются ссылки, вы можете выполнить свои изменения непосредственно на объектах, и изменения будут отражены в списке. Однако, если вы используете список с типизированным значением, вам нужен способ пометить элемент таким образом, чтобы при его удалении из списка и повторной добавке он не запускал бесконечный цикл.
Пример:
class Clean<T>
{
public T Value;
public bool IsClean;
public Clean(T value, bool clean)
{
Value = value;
IsClean = clean;
}
}
Этот чистый класс используется для хранения значения, а также флаг маркировки, если она была обработана или нет.
class Program
{
static void Main(string[] args)
{
ObservableCollection<Clean<int>> myCollection = new ObservableCollection<Clean<int>>();
myCollection.CollectionChanged += x_CollectionChanged;
myCollection.Add(new Clean<int>(2,false));
}
static void x_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//Grab the collection being modified
ObservableCollection<Clean<int>> collection = sender as ObservableCollection<Clean<int>>;
if (collection == null)
{
// do some error checking action
}
//Only look at items being added
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
//New item has been added
foreach (Clean<int> newItem in e.NewItems)
{
///Only perform the operation on new "dirty" objects
if (!newItem.IsClean)
{
collection.Remove(newItem);
//Add the new modified value and mark it as clean so that
// this process isn't run again
collection.Add(new Clean<int>(newItem.Value * 2,true));
}
}
}
}
}
Источники:
ObservableCollection
MSDN Article
NotifyCollectionChangedEventHandler
MSDN Article