代码之家  ›  专栏  ›  技术社区  ›  David Veeneman

WPF数据报最佳实践?

  •  1
  • David Veeneman  · 技术社区  · 15 年前

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

    在我深入研究这个问题之前,我想对我的方法做一个现实的检查。以下是我计划要做的: 小装置 班级将有一个 Index 将用于排序的属性 小装置 名单。添加、删除和重新排序将通过操作此索引属性来完成,排序将在 小装置 列表,而不是通过 CollectionView .

    之前 DataContext 被设置为 小装置 列表将按 索引 财产。当用户添加 小装置 , the 索引 属性将每增加1 小装置 在网格上选定项的下面,以及 小装置 将给出重新编号打开的索引编号。这个 小装置 将使用列表,并刷新绑定。

    当用户删除 小装置 , the 小装置 将从列表中删除,并且 索引 已删除项下网格上的项的属性将减少1。这个 小装置 将使用列表,并刷新绑定,如上所述。重新排序将作为删除和插入的组合进行。

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

    谢谢你的帮助。

    2 回复  |  直到 12 年前
        1
  •  1
  •   David Veeneman    15 年前

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

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

    我的视图模型订阅了任何包含IIndexedObjects的ObservableCollection的CollectionChanged属性。当事件激发时,视图模型将集合传递给ReindexCollection服务方法,该方法接受IIndexedObject。该方法只需迭代集合,并为每个元素的index属性分配一个增量整数值,即可根据集合的当前顺序对集合重新编制索引。当我将集合保存回数据库时,索引值将被保存,以确保下次运行时以相同的顺序加载集合。

    由于只需要在数据库加载时进行排序,因此不需要对ObservableCollection进行排序。当我移动数据报上的项目时,它将负责重新排序集合。我所要做的就是对集合重新编制索引,以便将其顺序持久化回数据库。

    总之,这比我想象的要容易得多。我喜欢WPF和MVVM的原因之一。