- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在寻求将撤消/重做(基于 this 文章)与使用 ICommand 的命令模式相结合。阅读有关 CanExecute 和 CanExecuteChanged 的想法后,我发现了 CommandManager,它将更改后的状态传播到所有已注册的 UIElement。但是,如果命令本身存储更改的数据,则似乎很难将这两者结合起来。这是当前情况的示例:
interface IUndoCommand : ICommand
{
void Undo();
}
和实现:
public class SampleCommand : IUndoCommand
{
private Point oldPosition;
private Shape shape;
// Gets the currently moved shape object
public MoveCommand(Shape shape, Point oldPosition)
{
this.oldPosition = oldPosition;
this.newPosition = new Point(Cavas.GetLeft(shape),Canvas.GetTop(shape));
this.shape = shape;
}
public void Execute(object parameter)
{
Model.PersistChanges(shape, newPosition);
}
public void Undo()
{
Model.PersistChanges(shape, oldPosition);
}
public bool CanExecute(object parameter)
{
}
public event EventHandler CanExecuteChanged;
}
在此实现中,命令存储更改,因此每次执行时都需要创建一个新实例。但是,CommandManager 会跟踪状态并通知 UIElement。如果我在那里注册命令的每个实例,一个 UIElement 有几个相同的命令竞争 CanExecute 状态。这似乎打破了思路,那么它是如何工作的呢?
当然,我可以将重做/撤消所需的状态从命令移动到模型,并准确地注册一个(静态)命令实例,它将在整个过程中使用。但实际上我喜欢在命令中存储状态的想法。
如果我省略 ICommand 用法,则 wpftutorial.net 的示例会起作用 - 虽然我还没有完全理解那里的操作/撤消操作。
如何组合这些方法,undo/redo + CommandManager?是在Model中实现保存状态的唯一解决方案(以MVVM为基础)还是有其他机会?
编辑:
是否可以在仍然使用 CommandManager 的命令中保存状态?ICommand-Interface 提供了跟踪 CanExecute-State 的功能,这是一个不错的主意。但是,我看不到在命令中保存状态的同时保留这个想法的可能性(因此需要几个不同的实例)。
最佳答案
对于其他遇到这个问题的人:
我现在使用分层 ViewModel 解决了这个问题。每个命令现在都有自己的 ViewModel。
public class ViewModel
{
public ViewModel()
{
MoveCommand = new MoveCommand(this);
}
public Shape Shape {get;set;}
public Point CurrentPosition {get;set;}
public ICommand MoveCommand {get; private set;}
}
public class MoveCommand
{
ViewModel viewModel;
Point shiftVector;
public MoveCommand(ViewModel viewModel, Point shiftVector)
{
this.viewModel = viewModel;
this.shiftVector = shiftVector;
}
public void Execute(object parameter)
{
shapeVM.CurrentPosition.X += shiftVector.X;
shapeVM.CurrentPosition.Y += shiftVector.Y;
}
public void Undo()
{
shapeVM.CurrentPosition.X -= shiftVector.X;
shapeVM.CurrentPosition.Y -= shiftVector.Y;
}
public bool CanExecute(object parameter)
{
}
// Notice here: the events should be passed to the command manager to take care about it
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove {CommandManager.RequerySuggested -= value;}
}
分层部分的作用如下:
public class BaseViewModel
{
ObservableCollection<ViewModels> ViewModels;
// pass the command from the child's viewModel.
public ICommand MoveCommand
{
get
{
return SelectedItem.MoveCommand;
}
}
public SelectedItem ViewModel {get;set;}
public BaseViewModel()
{
}
}
关于C# CommandManager 结合撤消/重做模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15784814/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!