我在我的程序中使用可观察的集合来存储"年"。用户可以"添加"或"删除"收集年份。所以"年"将列在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"。我想要的是在点击"取消"时撤消这些更改。按钮。
答案 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"));
}));
}
}
}
}
当您点击“取消”按钮时,您所要做的就是撤消您在“确定”按钮中所做的操作