撤消对WPF中Observable Collection的更改

时间:2015-06-30 07:19:54

标签: c# wpf observablecollection undo relaycommand

我在我的程序中使用可观察的集合来存储"年"。用户可以"添加"或"删除"收集年份。所以"年"将列在ListBox上。窗口有"好的"和"取消"。如果用户点击"取消"进入年份后按钮,我想撤消该更改并返回原始状态,因此用户将在下次尝试进入时看到Original Observable Collection而不进行任何更改。更改仅适用于点击"确定"按钮。我实施了#34; OK"按钮正确。我想要的是撤消更改,如果点击"取消"按钮。希望这很清楚。

public RelayCommand Cancel
{
    get
    {
        return _cancel
            ?? (_cancel = new RelayCommand(
            () =>
            {
                foreach (var change in ChangesList)
                {
                    switch (change.Action)
                    {
                        case NotifyCollectionChangedAction.Add:
                            // What I have to do here
                            break;
                        case NotifyCollectionChangedAction.Remove:
                            // What I have to do here.
                            break;
                    }
                }
                Messenger.Default.Send(new NotificationMessage("Cancel"));
            }));
    }
}

这是我的取消中继命令。我已将对Original Observable集合所做的更改变为" ChangeList"。我想要的是在点击"取消"时撤消这些更改。按钮。

3 个答案:

答案 0 :(得分:2)

制作您的原始可观察集合的副本:

var backup = collection.ToList();

当您需要取消时,只需:

collection.Clear();
foreach (var i in backup)
    collection.Add(i);

答案 1 :(得分:0)

我以前从未实现过这个,但我已经看过了。 Cologer解决方案是一种方法,但我查看的大多数解决方案都将更改保存到临时集合中,并在单击“确定”按钮时替换原始集合。因此,当单击取消按钮时,您不必撤消对原始集合所做的更改,因为它在整个过程中保持不变。

答案 2 :(得分:0)

感谢您的帮助。这是我的答案的解决方案。它按照我现在想要的方式工作。

public RelayCommand Cancel
    {
        get
        {
            return _cancel
                ?? (_cancel = new RelayCommand(
                () =>
                {
                    foreach (var change in ChangesList)
                    {
                        switch (change.Action)
                        {
                            case NotifyCollectionChangedAction.Add:
                                Clone.Remove((T)change.NewItems[0]);
                                break;
                            case NotifyCollectionChangedAction.Remove:
                                Clone.Insert(change.OldStartingIndex, (T)change.OldItems[0]);
                                break;
                        }
                    }
                    Messenger.Default.Send(new NotificationMessage("Cancel"));
                }));
        }
    }
            }
        }

当您点击“取消”按钮时,您所要做的就是撤消您在“确定”按钮中所做的操作