Я уже сталкивался с аналогичными требованиями и предпочитаю два варианта, оба с использованием привязки данных.
В первом варианте мы клонируем объект и связываемся с клоном. Когда пользователь нажимает ОК, клонированный объект заменяется реальным объектом. Это в основном полезно при редактировании одного объекта за раз, и на объект не ссылаются напрямую другие объекты. Если на него есть ссылка, то вместо этого вы можете скопировать значения из вашего клона в оригинал, чтобы ссылки оставались нетронутыми. Это экономит работу, поскольку в редакторах не требуется никакой дополнительной работы, самое большее, вы должны определить 2 метода для вашего объекта, клон и, возможно, метод Apply для копирования значений из клона.
Второй вариант мы привязываем к исходному объекту, но сохраняем исходные значения в нашем диалоге редактирования, либо в локальных полях, либо во временном объекте данных. Когда пользователь нажимает кнопку ОК, ничего особенного не должно произойти, но когда пользователь нажимает кнопку отмены, мы возвращаем значения. Это в основном полезно, когда вы редактируете только несколько простых свойств в диалоговом окне.
Я предпочитаю решения для привязки данных, потому что оно не загрязняет диалоги редактирования логикой применения / отмены, которая, если она реализована в редакторах, очень зависит от вашего XAML: элементы управления могут быть переименованы, поле со списком может быть заменено текстовым полем и т. Д., Все что повлияет на код, который вручную получает данные от элементов управления.
Методы Clone / Apply должны быть только для ваших бизнес-объектов, которые в теории более стабильны, чем ваши редакторы пользовательского интерфейса. Даже если XAML изменится, в большинстве случаев ваши привязки могут остаться прежними. Например, изменение из поля со списком в текстовое поле означает только то, что вы привязываетесь к тексту, а не к SelectedValue, но фактическая привязка такая же.