У нас есть UICollectionView с использованием пользовательского источника MvxCollectionViewSource в качестве источника. При выборе элемента мы хотим прокрутить до пункта, сделать короткую анимацию, а затем выполнить действие. В источнике ItemSelected переопределяется следующим образом, где событие установлено для ScrollAnimationEnded.Проблема с UICollectionView с использованием xamarin.ios и mmvmcross v3
public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
{
var item = GetItemAt(indexPath) as SlideMenuViewItemModel;
var cell = collectionView.VisibleCells[0];
var index = collectionView.IndexPathForCell(cell);
if (!Equals(index, indexPath))
{
collectionView.ScrollAnimationEnded += HandleAnimationDone;
collectionView.ScrollToItem(indexPath, UICollectionViewScrollPosition.CenteredHorizontally, true);
}
else
{
var layout = (SlideMenuLayout)collectionView.CollectionViewLayout;
layout.SelectedIndexPath = indexPath;
collectionView.PerformBatchUpdates(delegate { }, delegate
{
item.OnClick.Execute(null);
layout.SelectedIndexPath = null;
});
}
}
private void HandleAnimationDone(object sender, EventArgs args)
{
CollectionView.ScrollAnimationEnded -= HandleAnimationDone;
var layout = (SlideMenuLayout)CollectionView.CollectionViewLayout;
CollectionView.PerformBatchUpdates(delegate { }, delegate
{
// item.OnClick.Execute(null);
layout.SelectedIndexPath = null;
});
}
Проблема в том, что она работает только в первый раз. Элемент выбран и прокрутка выполняется, и событие активируется. Однако при попытке сделать следующий выбор ItemSelected никогда не вызывается. Если я удалю строку collectionView.ScrollAnimationEnded + = HandleAnimationDone, она будет работать. Поэтому кажется, что подключение к событию ломает что-то или мне нужно вызвать что-то для сброса.
Я надеюсь, что у вас есть предложение :)
С уважением