Skip to content

Trying to remove item from BindableListView causes ArgumentOutOfRangeException #11

Closed
@CunningFox146

Description

@CunningFox146

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>();
        }
    }
}

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions