Отменить возврат стека

Я делаю простой UndoRedo Framework, используя стеки, но по какой-то причине что-то не работает. У меня есть этот код для хранения свойства объекта, в данном случае ColorBlend

public static ColorBlend _BG_Blend = new ColorBlend();
public ColorBlend BG_Blend
{
    get { return _BG_Blend; }
    set
    {
        AddLog("BG_Blend", _BG_Blend); //Name && Property Value
        _BG_Blend = value;                   
    }
}

Теперь каждый раз, когда я меняю смесь, это сохраняет новое свойство в стеке и отправляет сигнал о том, что новое действие можно отменить. Если есть, скажем, 5 разных ColorBlends в журнале, когда я нажимаю «Отменить», он возвращает сохраненные свойства, но все они имеют одинаковые цвета, все позиционирует. Кто-нибудь знает почему?


person Adrao    schedule 09.03.2013    source источник
comment
Вам нужно будет показать всю свою реализацию. Мы не можем догадаться, в чем проблема, всего лишь с парой строк кода.   -  person Jonathon Reinhart    schedule 10.03.2013
comment
О каком фреймворке отмены / повтора вы говорите? Это один: codeproject.com / Статьи / 19550 /?   -  person andri    schedule 10.03.2013


Ответы (4)


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

person cara    schedule 09.03.2013

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

person gilly3    schedule 09.03.2013

В сеттере вы назначаете

_BG_Blend = value;                   

в получателе вы возвращаетесь

return _BG_Blend;

Итак, да, вы получите последнее присвоенное значение независимо от того, что находится в вашем стеке.

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

person gdoron is supporting Monica    schedule 09.03.2013
comment
это выполняется UndoRedoFramework каждый раз, когда один из стеков меняет, он обновляет объект parrent - person Adrao; 10.03.2013
comment
@ user2147134, может быть ... вы покажете нам весь свой код и как вы его используете? наш хрустальный шар отключен с понедельника. - person gdoron is supporting Monica; 10.03.2013

Ваша переменная-член _BG_Blend static, поэтому существует только один ее экземпляр. Каждый раз, когда вы нажимаете новую смесь, вы перезаписываете статическую переменную новым значением, но поскольку все ваши шаги отмены просто указывают на это единственное общее значение, они все «перезаписываются» им.

Просто удалите модификатор static.

person Jason Williams    schedule 09.03.2013