WPF DataGrid最佳实践?

时间:2009-09-17 21:58:24

标签: wpf mvvm datagrid wpfdatagrid

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

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

Widget设置之前,Index列表将在Widget属性上排序。当用户添加Index时,对于网格上所选项目下方的每个WidgetWidget属性将增加1,并且新的Widget将被赋予索引号由重新编号打开。将使用Widget列表,并且将刷新绑定。

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

以下是我的问题:这是实施插入,删除和重新排序的合理策略吗?还有更好的方法吗?关于这个主题的任何好文章或博客文章?我看了,但我没有提出任何关键点。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)