C# 在基于MVVM的应用程序中实现撤消/重做时遇到问题

C# 在基于MVVM的应用程序中实现撤消/重做时遇到问题,c#,wpf,mvvm,C#,Wpf,Mvvm,在我的应用程序中实现任何类型的撤销重做系统都有问题。我想要一些关于我需要如何在我的情况下这样做的指导。我读过Memento模式,它似乎是最常用的,但我不知道如何实现它 首先,我的应用程序是使用MVVM构建的,因此来自UI的所有操作都绑定到一个返回ICommand的方法。下面是一个例子: public ICommand PlaySoundCommand { get { return new DelegateCommand(PlaySound); } } private void Play

在我的应用程序中实现任何类型的撤销重做系统都有问题。我想要一些关于我需要如何在我的情况下这样做的指导。我读过Memento模式,它似乎是最常用的,但我不知道如何实现它

首先,我的应用程序是使用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);
        }
    }
}
private ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>();
public ObservableCollection<GroupViewModel> GroupModelList
{
    get { return groupModelList; }
    set
    {
        groupModelList = value;
        OnPropertyChanged("GroupModelList");
    }
}
完成后,使用UI调用的任何方法都会完成其任务。例如,有一个名为
addGroup()
的方法,它显然会将一个组添加到保存所有组的
observedcollection
。该集合声明如下:

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);
        }
    }
}
private ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>();
public ObservableCollection<GroupViewModel> GroupModelList
{
    get { return groupModelList; }
    set
    {
        groupModelList = value;
        OnPropertyChanged("GroupModelList");
    }
}
private ObservableCollection groupModelList=new ObservableCollection();
公共ObservableCollection组模型列表
{
获取{返回groupModelList;}
设置
{
groupModelList=值;
OnPropertyChanged(“GroupModelList”);
}
}
在该
GroupModel
中还有另一个对象类型的viewmodel,其中包含属于该特定组的列表。(它还包含其他属性,但这些属性是简单的字符串和浮点)

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


如果你需要更多的代码,请告诉我。提前谢谢

撤消/重做系统要求所有操作都按照
ICommand
s执行。然后将每个
ICommand
对象
推送到一个集合中。要撤消,请从集合中弹出最后一个
ICommand
,然后执行相反的操作。但是,这听起来比实际情况简单,因为您还需要存储所有相关参数,并且可能需要为每个
ICommand
单独执行撤消操作。请在线搜索进一步的信息,因为这个主题涉及面很广,不太适合关于堆栈溢出的问题。感谢您提供的信息,这是一个很好的来源。如果我必须对带有数据绑定的文本框执行此操作,它不会通过命令触发,而是直接从源代码更改文本。我该怎么做呢?怎么回事。。。你99%的问题都是填充词。播放声音的命令与撤消/重做有什么关系?我不知道这是什么,这只是我的UI如何与代码“对话”的一个例子。所有UI控件(尤其是按钮)都绑定到这些类型的命令。我正在展示我的应用程序的一般工作方式,因此您可以通过说明我需要做什么才能使撤销/重做正常工作来帮助我