我正在开发一个使用DataGrid
的基于MVVM的WPF应用程序。网格数据绑定到ObservableCollection<Widget>
(Widget
列表)。用户需要能够在当前选定的Widget
下方的列表中插入Widget
,以删除选定的Widget
,并重新排序Widget
上的Widget
网格。我将通过拖放实现重新排序。
在我深入研究之前,我想对我的方法进行现实检查。以下是我打算做的事情:Index
类将有一个Widget
属性,用于订购Widget
列表。添加,删除和重新排序将通过操作此Index属性来完成,排序将在CollectionView
列表上完成,而不是通过DataContext
。
在Widget
设置之前,Index
列表将在Widget
属性上排序。当用户添加Index
时,对于网格上所选项目下方的每个Widget
,Widget
属性将增加1,并且新的Widget
将被赋予索引号由重新编号打开。将使用Widget
列表,并且将刷新绑定。
当用户删除Widget
时,Index
将从列表中删除,并且已删除项目下方网格上项目的Widget
属性将减1。如上所述,将使用{{1}}列表,并刷新绑定。重新排序将作为删除和插入组合完成。
以下是我的问题:这是实施插入,删除和重新排序的合理策略吗?还有更好的方法吗?关于这个主题的任何好文章或博客文章?我看了,但我没有提出任何关键点。
感谢您的帮助。
答案 0 :(得分:1)
我发现了这个问题。我确实需要Index属性,但我不需要对ObservableCollection进行排序。我创建了一个接口,IIndexedObject,有一个属性,索引。我在任何需要索引的对象上实现该接口,并在我的数据库表中添加一个Index列。
当我加载到我的对象模型中时,我在Index属性上对数据库表进行排序。这可确保列表的加载顺序与上次运行时的顺序相同。我使用DataGrid底部提供的空行添加对象。它为它们提供了索引0.我使用绑定到视图模型中的ICommand的Delete按钮删除对象。
我的视图模型订阅任何包含IIndexedObjects的ObservableCollection的CollectionChanged属性。触发事件时,视图模型将集合传递给ReIndexCollection服务方法,该方法采用IIndexedObject。该方法基于其当前顺序对集合进行重新索引,方法是简单地迭代集合,为每个元素的Index属性分配增量整数值。当我将集合持久化回数据库时,将保存Index值,以确保在下次运行时以相同的顺序加载集合。
由于所需的唯一排序是在数据库加载时完成的,因此无需对ObservableCollection进行排序。当我在DataGrid上移动项目时,它将负责在那时重新排序集合。我所要做的就是重新索引集合,以便将其顺序保存回数据库。
总而言之,它比我预期的要容易得多。我喜欢WPF和MVVM的原因之一。
答案 1 :(得分:0)