【问题标题】:WPF DataGrid Best Practices?WPF DataGrid 最佳实践?
【发布时间】:2009-09-17 21:58:24
【问题描述】:

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

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: wpf mvvm datagrid wpfdatagrid


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 抱歉,它并没有真正解决所提出的问题。我正在寻找有关该方法的反馈,而不是数据网格排序技巧。
      猜你喜欢
      • 2014-02-04
      • 2013-01-08
      • 2011-08-06
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多