Смотрите здесь:
http://blogs.claritycon.com/blogs/lee_roth/default.aspx
Я делаю утилизацию следующим образом:
В OnItemsChanged
я звоню только RemoveInternalChildRange
:
protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args)
{
switch (args.Action)
{
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Replace:
RemoveInternalChildRange(args.Position.Index, args.ItemUICount);
break;
case NotifyCollectionChangedAction.Move:
RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount);
break;
}
}
При переопределении меры я сначала добавляю новые элементы, а затем удаляю старые.
Если вы используете утилизацию отходов, вы должны знать, что новый флаг, полученный при вызове GenerateNext, также ложен, если вы получаете переработанный контейнер.
Здесь мы добавляем новые элементы:
GeneratorPosition start = ItemContainerGenerator.GeneratorPositionFromIndex(iFirstItemIndex);
int iChildIndex = (start.Offset == 0) ? start.Index : start.Index + 1;
using (ItemContainerGenerator.StartAt(start, GeneratorDirection.Forward, true))
{
for (int i = iFirstItemIndex; i <= iLastItemIndex; i++, iChildIndex++)
{
bool bNew;
UIElement element = (UIElement)ItemContainerGenerator.GenerateNext(out bNew);
//If we get a new instance
if (bNew)
{
if (iChildIndex >= Children.Count) AddInternalChild(element);
else InsertInternalChild(iChildIndex, element);
ItemContainerGenerator.PrepareItemContainer(element);
}
//If we get a recycled element
else if (!InternalChildren.Contains(element))
{
InsertInternalChild(iChildIndex, element);
ItemContainerGenerator.PrepareItemContainer(element);
}
element.Measure(...);
}
}
После добавления элементов мы удаляем старые элементы:
for (int i = Children.Count - 1; i >= 0; i--)
{
GeneratorPosition childGeneratorPosition = new GeneratorPosition(i, 0);
int iIndex = ItemContainerGenerator.IndexFromGeneratorPosition(childGeneratorPosition);
if (iIndex < iFirstItemIndex || iIndex > iLastItemIndex)
{
//remove() calls ItemContainerGenerator.remove() OR recycle(). Both works.
remove(childGeneratorPosition, 1);
RemoveInternalChildRange(i, 1);
}
}
Я надеюсь, что смогу вам помочь.