редактирование объекта и флаг isDirty () - PullRequest
7 голосов
/ 14 октября 2008

Я работаю в системе, где пользователь может редактировать существующие объекты (точнее, объекты «Фильтр») через графический интерфейс. Как подсказка пользовательского интерфейса, мы хотим включить кнопку сохранения, только если пользователь действительно что-то изменил в объекте. Мне было интересно, есть ли у кого-нибудь опыт с этой проблемой и как лучше всего подойти к ней.

Я думал о добавлении флага isDirty () к объекту домена. Когда пользователь начинает редактировать фильтр, я делаю копию, передаю ее в графический интерфейс и позволяю пользователю вносить изменения в копию. Привязка к флагу isDirty () включит / отключит кнопку сохранения. При сохранении различия затем объединяются в исходный объект и сохраняются.

Кроме того, я думал о том, что произойдет, если пользователь отменит изменения, внесенные в объект. Флаг isDirty () должен затем вернуть false. Поэтому я думаю, что единственный способ добиться этого - сохранить исходное значение каждого свойства внутри объекта домена.

Есть идеи?

Ответы [ 7 ]

3 голосов
/ 14 октября 2008

Правильно!

Кроме того, вы можете выставить два метода: BeginEdit - в этом методе вы помечаете свой IsDirty Flag как True. Это означает, что вы делаете модификацию. Вызывайте этот метод, когда собираетесь внести изменения

CancelEdit - в этом методе установите для флага IsDirty значение False. Это означает, что вы произвели процесс редактирования и вернули его в исходное состояние. Вызывайте этот метод при отмене любых внесенных изменений.

И после того, как любые изменения будут сохранены, вы также сбросите флаг IsDirty на False.

Надеюсь, это поможет.

2 голосов
/ 15 октября 2008

Существует несколько интерфейсов, которые вы можете реализовать для отслеживания изменений и отмены: INotifyPropertyChanged и IEditableObject. Оба эти интерфейса позволяют объекту хорошо играть с привязкой данных.

public class Person : INotifyPropertyChanged, IEditableObject
{
    private bool isDirty;

    public bool IsDirty
    {
        get { return isDirty; }
    }

    private string firstname = string.Empty;

    public string Firstname
    {
        get { return firstname; }
        set
        {
            if (firstname == value) return;
            firstname = value;
            NotifyPropertyChanged("Firstname");
        }
    }

    private string lastname = string.Empty;

    public string Lastname
    {
        get { return lastname; }
        set
        {
            if (lastname == value) return;
            lastname = value;
            NotifyPropertyChanged("Lastname");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        isDirty = true;

        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool inTrans;
    private Person copy;

    public void BeginEdit()
    {
        if (!inTrans)
        {
            if (copy == null)
                copy = new Person();

            copy.isDirty = isDirty;
            copy.Firstname = Firstname;
            copy.Lastname = Lastname;


            inTrans = true;
            isDirty = false;
        }
    }

    public void CancelEdit()
    {
        if (inTrans)
        {
            isDirty = copy.isDirty;
            Firstname = copy.Firstname;
            Lastname = copy.Lastname;

            inTrans = false;
        }
    }

    public void EndEdit()
    {
        if (inTrans)
        {
            copy = null;
            inTrans = false;
        }
    }
}
2 голосов
/ 14 октября 2008

Если вы используете .NET Framework, вы можете взглянуть на CSLA .NET Framework от Rockford Lhotka: http://www.lhotka.net/cslanet/Default.aspx

CSLA - это зрелая структура, которая включает в себя управление состоянием объекта (IsDirty), функциональность отмены, привязку данных и многое другое, плюс она бесплатна и имеет открытый исходный код.

1 голос
/ 14 октября 2008

Если вы поддерживаете операцию отмены на уровне детализации больше, чем «отменить все с момента последнего сохранения», то я бы предложил отменить стек Когда что-то редактируется, оно (или функтор отмены операции или делегат) добавляется в стек. Когда вы отменяете, вы просто выталкиваете стек и отменяете операцию. Тогда ваш флаг isDirty () - это просто проверка, содержит ли стек отмены элементы, а не дополнительное хранилище и логику для обновления.

1 голос
/ 14 октября 2008

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

Преимущество этого предложения заключается в том, что оно не привязывает специфические функции графического интерфейса (флаг isDirty ()) к объектам вашего домена, но YMMV

1 голос
/ 14 октября 2008

Да, это хорошо работает. Вместо того, чтобы отменить, я использую метод IsDirty, чтобы показать, что что-то МОЖЕТ изменить запись, а затем это вызывает мою «логику изменения записи». Я разработал собственную структуру, где каждое поле таблицы на самом деле является свойством объекта. Каждый раз, когда поле записывается в объекты, устанавливается флаг isDirty. В методе объекта «SaveObject» (на самом деле это вспомогательный класс, но он может легко находиться в объекте, но я хотел иметь возможность сохранять объекты различными способами, например в XML, базе данных и т. если значение false, я пропускаю сохранение. Это упрощает логику, так как каждый раз, когда у меня была возможность изменить объект, я вызываю SaveObject и позволяю платформе обрабатывать его.

1 голос
/ 14 октября 2008

Если у вас есть набор объектов, которые редактируются, вам, вероятно, понадобится нечто большее, чем логический флаг для isDirty (). Эта проблема не отличается от подсчета ссылок, то есть увеличивает грязный счет при редактировании и уменьшает при отмене. Если вы поддерживаете отмену, я подозреваю, что вы столкнетесь с довольно волосатой логикой. Я бы не пустил его в ваши доменные объекты.

...