public void SwapBlocks(int sourceIndex, int destinationIndex)
        {
            Block block = blocks[sourceIndex];

            blocks.RemoveAt(sourceIndex);
            blocks.Insert(destinationIndex, block);

            // Context for moved block, source, source + 1, and destination + 1 blocks possibly changed so update viewmodels
            BlockViewModel movedBlockViewModel = blockViewModelFactory.CreateBlockViewModel(block, blocks);

            blockViewModels.RemoveAt(sourceIndex);
            blockViewModels.Insert(destinationIndex, movedBlockViewModel);

            BlockViewModel newBlockAtSource = blockViewModelFactory.CreateBlockViewModel(blocks[sourceIndex], blocks);

            blockViewModels[sourceIndex] = newBlockAtSource;

            if (sourceIndex + 1 < blocks.Count)
            {
                BlockViewModel afterSource = blockViewModelFactory.CreateBlockViewModel(blocks[sourceIndex + 1], blocks);
                blockViewModels[sourceIndex + 1] = afterSource;
            }

            if (destinationIndex + 1 < blocks.Count)
            {
                BlockViewModel afterDestination = blockViewModelFactory.CreateBlockViewModel(blocks[destinationIndex + 1], blocks);
                blockViewModels[destinationIndex + 1] = afterDestination;
            }

            programRepository.Update(blocks);
            BlocksChanged?.Invoke(this, EventArgs.Empty);
        }
        void AddBlock(Block block)
        {
            blocks.Add(block);
            blockViewModels.Add(blockViewModelFactory.CreateBlockViewModel(block, blocks));

            programRepository.Update(blocks);
            BlocksChanged?.Invoke(this, EventArgs.Empty);
        }
        void ReplaceBlock(Block oldBlock, Block newBlock)
        {
            int index = blocks.FindIndex(block => block == oldBlock);

            if (index >= 0)
            {
                blocks[index]          = newBlock;
                blockViewModels[index] = blockViewModelFactory.CreateBlockViewModel(newBlock, blocks);

                programRepository.Update(blocks);
                BlocksChanged?.Invoke(this, EventArgs.Empty);
            }
        }
        void RemoveBlock(Block block)
        {
            int index = blocks.FindIndex(b => b == block);

            if (index >= 0)
            {
                blocks.RemoveAt(index);
                blockViewModels.RemoveAt(index);

                // Create new view model to set new context blocks
                if (index < blocks.Count)
                {
                    BlockViewModel newBlockViewModel = blockViewModelFactory.CreateBlockViewModel(blocks[index], blocks);
                    blockViewModels[index] = newBlockViewModel;
                }

                programRepository.Update(blocks);
                BlocksChanged?.Invoke(this, EventArgs.Empty);
            }
        }