在基于MVVM的应用程序中实现Undo / Redo时出现问题

时间:2015-06-04 07:40:28

标签: c# wpf mvvm

我在应用程序中实现任何类型的撤消重做系统时都遇到了问题。在我的案例中,我想要一些指导我如何做到这一点。我已经阅读了Memento Pattern,它似乎是最常用的,但我无法弄清楚如何实现它。

首先,我的应用程序是使用MVVM构建的,因此UI中的所有操作都绑定到返回ICommand的方法。这是一个例子:

public ICommand PlaySoundCommand
{
    get { return new DelegateCommand(PlaySound); }
}

private void PlaySound()
{
    methods.playSound(soundPath, selectedSound);
}

因此,PlaySoundCommand绑定到UI控件,并执行需要对数据进行的更改。 DelegateCommand看起来像这样:

class DelegateCommand : ICommand
{
    private readonly Action action;

    public event EventHandler CanExecuteChanged;

    public DelegateCommand(Action action_)
    {
        action = action_;
    }

    public void Execute(object parameter)
    {
        action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}

完成后,无论使用UI调用哪种方法都可以。例如,有一个名为addGroup()的方法,显然会将一个组添加到包含所有组的ObservableCollection<GroupModelView>。该集合声明如下:

private ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>();
public ObservableCollection<GroupViewModel> GroupModelList
{
    get { return groupModelList; }
    set
    {
        groupModelList = value;
        OnPropertyChanged("GroupModelList");
    }
}

GroupModel内,还有另一个另一个对象类型的视图模型,它包含属于该特定组的列表。 (它还包含其他属性,但这些属性是简单的字符串和浮点数)

我将如何为此实现撤消/重做系统?

如果您需要更多代码,请与我们联系。提前谢谢!

0 个答案:

没有答案