我可以回收集合更改事件的集合更改吗?

时间:2010-12-25 16:47:04

标签: wpf mvvm inotifycollectionchanged

我有2个列表视图...并在它们之间添加/删除按钮。

在viewmodel中的list-view-collection的集合更改事件中,我可以回滚特定条件的更改吗?

3 个答案:

答案 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。