我在应用程序中实现任何类型的撤消重做系统时都遇到了问题。在我的案例中,我想要一些指导我如何做到这一点。我已经阅读了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
内,还有另一个另一个对象类型的视图模型,它包含属于该特定组的列表。 (它还包含其他属性,但这些属性是简单的字符串和浮点数)
我将如何为此实现撤消/重做系统?
如果您需要更多代码,请与我们联系。提前谢谢!