Как мне отменить все изменения, внесенные в самообследуемый объект? - PullRequest
2 голосов
/ 09 июля 2011

У меня есть клиентское приложение, которое загружает несколько STE через WCF.

Используя приложение WPF, пользователи могут выбрать объект из ListBox и отредактировать его с помощью всплывающего окна UserControl. Поскольку UserControl привязан непосредственно к объекту, когда пользователь вносит изменения, он, конечно, влияет на объект.

Я хотел бы предоставить функцию Cancel , которая отменяет все изменения, внесенные в объект.

Есть мысли?

Ответы [ 4 ]

3 голосов
/ 09 июля 2011

Вы можете сохранить оригинальную копию объекта.И отредактируйте его клонированную версию.
Если пользователь отменяет изменения, которые вы просто сохраняете, используя оригинальную копию.

3 голосов
/ 09 июля 2011

Я бы сказал, что при использовании WPF только в привязанном событии PropertyChanged сохраните словарь с ключом PropertyName и значением PropertyValue.А после восстановления состояния с помощью отражения

2 голосов
/ 25 июня 2012

Я использую это решение до сих пор Метод расширения

using System.Collections.Generic;
using System.Reflection;

namespace WpfApplication4
{
    public static class EFExtensions
    {
        /// <summary>
        /// Rejects changes made by user
        /// </summary>
        /// <param name="param">Object implementing IObjectWithChangeTracker interface</param>
        public static void RejectChanges(this IObjectWithChangeTracker param)
        {
            OriginalValuesDictionary ovd = param.ChangeTracker.OriginalValues;
            PropertyInfo[] propertyInfos = (param.GetType()).GetProperties();

            foreach (KeyValuePair<string, object> pair in ovd)
            {
                foreach (PropertyInfo property in propertyInfos)
                {
                    if (property.Name == pair.Key && property.CanWrite)
                    {
                        property.SetValue(param, pair.Value, null);
                    }
                }
            }
        }
    }
}

Основной код

using System.Linq;

namespace WpfApplication4
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            using (var db = new PlatEntities())
            {
                PacketEPD pd = (from epd in db.PacketEPD
                                select epd).First();
                pd.ChangeTracker.ChangeTrackingEnabled = true;
                pd.EDNo = "1";
                pd.RejectChanges();
            }
        }
    }
}
2 голосов
...