1

我正在开发一个基于 MVVM 的 WPF 应用程序,该应用程序使用DataGrid. 网格数据绑定到ObservableCollection<Widget>Widget列表)。用户需要能够将 aWidget插入到 current-selected 下方的列表中Widget,以删除 selectedWidget并重新排序Widget网格上的 s。我将通过拖放实现重新排序。

在深入研究之前,我想对我的方法进行一次现实检查。这是我打算做的事情:Widget该类将具有一个Index用于对Widget列表进行排序的属性。添加、删除和重新排序将通过操作此 Index 属性来完成,排序将在Widget列表上完成,而不是通过CollectionView.

DataContext设置之前,Widget列表将按Index属性排序。当用户添加 aWidget时,该Index属性将Widget在网格上所选项目的下方每增加 1,并且新的Widget将被赋予通过重新编号打开的索引号。该Widget列表将重新启用,并且绑定将被刷新。

当用户删除 aWidget时,Widget将从列表中删除,并且Index已删除项目下方网格上项目的属性将减 1。Widget列表将被重新使用,并且绑定刷新,如上。重新排序将作为删除和插入的组合完成。

这是我的问题:这是实现插入、删除和重新排序的合理策略吗?有没有更好的方法来解决它?关于这个主题的任何好的文章或博客文章?我看过,但我没有提出任何关于点的东西。

谢谢你的帮助。

4

2 回答 2

1

我已经弄清楚了这个问题。我确实需要 Index 属性,但不需要对 ObservableCollection 进行排序。我创建了一个接口 IIndexedObject,它具有一个属性 Index。我在任何需要索引的对象上实现该接口,并在我的数据库表中添加一个索引列。

当我加载到我的对象模型中时,我在 Index 属性上对数据库表进行排序。这可确保列表以与上次运行相同的顺序加载。我使用 DataGrid 底部提供的空白行添加对象。它给它们的索引为 0。我使用绑定到视图模型中的 ICommand 的 Delete 按钮删除对象。

我的视图模型订阅了任何包含 IIndexedObjects 的 ObservableCollection 的 CollectionChanged 属性。当事件触发时,视图模型将集合传递给 ReIndexCollection 服务方法,该方法采用 IIndexedObject。该方法通过简单地迭代集合,为每个元素的 Index 属性分配一个增量整数值,根据其当前顺序重新索引集合。当我将集合持久化回数据库时,索引值被保存,以确保在下次运行时以相同的顺序加载集合。

由于唯一需要的排序是在数据库加载时完成的,因此不需要对 ObservableCollection 进行排序。当我在 DataGrid 上移动项目时,它会在那时负责重新排序集合。我所要做的就是重新索引集合,以便将其顺序保留回数据库。

总而言之,这比我预期的要容易得多。我喜欢 WPF 和 MVVM 的原因之一。

于 2009-09-18T15:12:50.050 回答
0

提高排序性能:http: //blogs.msdn.com/jgoldb/archive/2008/10/30/improving-microsoft-datagrid-sorting-performance-part-3.aspx

于 2009-09-18T02:46:39.753 回答