Отмена изменений в коллекции

282
13 марта 2017, 08:00

В программе используется простенький UserControl (модальное окно), в котором редактируется коллекция цветовых меток.

Сама коллекция выглядит следующим образом:

public static ObservableCollection<ColorVM> Colors { get; set; } = new ObservableCollection<ColorVM>()
{
    new ColorVM {Title = "Green", Value = "#a0db8e"},
    new ColorVM {Title = "Red", Value = "#b44545"},
    new ColorVM {Title = "Orange", Value = "#e28356"},
    new ColorVM {Title = "Blue", Value = "#2b90f5"}
};

Мне не понятно как реализовать метод кнопки Cancel, чтобы все изменения в коллекции откатывались на момент до начала редактирования. Была мысль реализовать ICloneable у ColorVM и копировать всю исходную коллекцию для редактирования в UserControl. Но я не уверен в правильности такого подхода.

Подскажите, как правильно такое реализуется?

Answer 1

Да, клонирование — правильный подход.

Когда вы открываете ваш объект на редактирование, вы создаёте его клон. Есть два подхода:

  1. либо вы даёте на редактирование клон, а при выборе юзером OK заменяете оригинал на клон,
  2. либо вы даёте на редактирование оригинал, а при выборе Cancel заменяете отредактированный оригинал на клон.

При втором подходе остальные части программы видят изменения в редактируемом объекте прямо во время редактирования, так что этот подход сейчас, кажется, более модный.

Если коллекция большая (скажем, десятки или сотни тысяч элементов), имеет смысл подумать об оптимизации. Можно хранить не две копии коллекции, а одну, и набор операций редактирования в виде объектов, представляющих операции: добавление элемента, удаление, замена одного элемента на другой. Но этим не стоит заморачиваться пока производительность простого подхода остаётся нормальной.

READ ALSO
Проблема с декодированием ответа от WebSocket. C#

Проблема с декодированием ответа от WebSocket. C#

Есть сервер на С# и клиент на скриптеДанные от сервера отправляются хорошо, а вот с приемом разобраться не могу

276
Xamarin videoView черный экран но звук идет

Xamarin videoView черный экран но звук идет

Звук идет а плеер черный

275
gulp + browser-sync обновляет не все файлы php

gulp + browser-sync обновляет не все файлы php

Все крутится на openserver

520
Добавить поле поиска в GridView

Добавить поле поиска в GridView

В БД есть три таблицы, свзянанные внешними ключами

264