Closed
Description
I've made a BindableListView that has some items that should get added or removed. When trying to remove item from list or calling Clrear on collection, I get ArgumentOutOfRangeException. My ViewModel class:
using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using ArPaint.Services.Draw;
using ArPaint.UI.Systems.Stack;
using ArPaint.UI.Views.DrawingInfo;
using ArPaint.Utils;
using UnityMvvmToolkit.Core;
using UnityMvvmToolkit.Core.Attributes;
using UnityMvvmToolkit.Core.Interfaces;
namespace ArPaint.UI.ViewModels.Home
{
public class HomeViewModel : ViewModel
{
private readonly IDrawingsProvider _drawingsProvider;
[Observable(nameof(Drawings))]
private readonly IProperty<ObservableCollection<DrawingViewModel>> _drawings;
public ObservableCollection<DrawingViewModel> Drawings => _drawings.Value;
public ICommand CreateDrawingCommand { get; }
public HomeViewModel(IDrawingsProvider drawingsProvider)
{
_drawingsProvider = drawingsProvider;
CreateDrawingCommand = new Command(CreateDrawing);
_drawings = new Property<ObservableCollection<DrawingViewModel>>(new ObservableCollection<DrawingViewModel>());
_drawingsProvider.Drawings.CollectionChanged += OnDrawingsChanged;
BuildDrawingsCollection();
}
private void OnDrawingsChanged(object sender, NotifyCollectionChangedEventArgs evt)
{
switch (evt.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (var item in evt.NewItems)
{
if (item is DrawingData drawing)
Drawings.Add(new DrawingViewModel(drawing, SelectDrawing));
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (var item in evt.OldItems)
{
if (item is DrawingData drawing)
Drawings.RemoveAll(viewModel => viewModel.Drawing == drawing);
}
break;
default:
break;
}
}
private void BuildDrawingsCollection()
{
foreach (var drawing in _drawingsProvider.Drawings)
{
Drawings.Add(new DrawingViewModel(drawing, SelectDrawing));
}
}
private void CreateDrawing()
{
_drawingsProvider.SelectDrawing(null);
ViewStack.PushView<DrawingInfoView>();
}
private void SelectDrawing(DrawingData drawing)
{
_drawingsProvider.SelectDrawing(drawing);
ViewStack.PushView<DrawingInfoView>();
}
}
}