我有2个列表视图...并在它们之间添加/删除按钮。
在viewmodel中的list-view-collection的集合更改事件中,我可以回滚特定条件的更改吗?
答案 0 :(得分:5)
您可以处理ObservableCollection
CollectionChanged
事件来备份(通过VM或其他)旧值(请参阅CollectionChanged
属性)并在需要时(即用户时)将其恢复点击“撤消”等。
更新参考以下评论:
如果您确实想要使用private void Window_Loaded(object sender, RoutedEventArgs e)
{
var x = new ObservableCollection<string>();
x.CollectionChanged +=
new NotifyCollectionChangedEventHandler(x_CollectionChanged);
x.Add("asdf");
x.Remove("asdf");
}
bool rollingBack = false;
void x_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (rollingBack) return;
if (e.Action == NotifyCollectionChangedAction.Remove)
{
if (e.OldItems.Contains("asdf"))
{
var oc = (ObservableCollection<string>)sender;
rollingBack = true;
oc.Add("asdf");
rollingBack = false;
}
}
}
事件处理程序回滚集合,请创建一个标志,以便从递归调用中转义处理程序(未使用多线程应用程序进行测试),这是一个简单的示例,您可以轻松调整它以适应您的V / VM。
{{1}}
答案 1 :(得分:1)
考虑到您将事件的发送者作为对象(即事件的第一个参数)和被修改的对象列表,是的,您可以这样做。不过我不会这么说。如果遇到这样的情况,请在ViewModel上提供一个随EventArgs
提供的方法,让它完成工作。视图不是做逻辑的地方。
更好:检查ViewModel本身的状况(即在添加/删除响应的命令中)! viewmodel对信息的状态是可响应的,因此请保持逻辑。视图就在那里显示数据。
答案 2 :(得分:0)
Shimmy的回答在Windows应用商店应用中对我不起作用,你仍然会遇到重新引发的问题并获得 df.drop(df.year_week.str.len() < 6, inplace=True)
df.year_week = df.year_week.astype(int)
谚语&#34;无法改变CollectionChanged事件期间的ObservableCollection。&#34;
我必须使用UI的调度程序并禁用/启用事件处理程序以避免这些问题。
警告:这是一个黑客,框架设计师竭尽全力阻止你这样做。因此,如果你想忽略他们的警告,小心不要用脚射击自己。
InvalidOperationException
这将避免异常,避免递归调用处理程序,并正确更新UI。