我正在使用telerik RadTreeView来显示文件夹的层次结构。用户必须能够在此树中添加/删除/重命名文件夹。这工作到目前为止,但树每次更改树时应按字母顺序排序。排序TreeView的节点
排序TreeView我应该排序基础数据模型。这意味着顶级文件夹和递归的所有孩子。
我的底层模型存储在数据库中并使用EF进行访问。它基本上是一个实体“TreeFolder”,其自身与1:n关联。 EF允许我以EntityCollection的身份访问TreeFolder的子文件夹。
我的问题在于:我如何排序EntityCollections?到目前为止,我知道这是不可能的 - 我应该使用像CollectionViewSource这样的包装器。这将意味着我需要创建一个新的类“SortableTreeFolder”(或扩展从EF的部分类)持有这样一个CollectionViewSource。这意味着当树被加载时,我需要将所有的孩子复制到这个CollectionViewSource中。
是否有可能仅使用EF导航属性对TreeView模型进行排序?
编辑: 尝试不同的东西(感谢Uwy)后,我碰到这个部位,以及跌跌撞撞:Sorting EF Collection
有这样说的:
虽然EntityCollection不实现IList,它实现了IListSource CollectionViewSource将调用IListSource.GetList方法来创建视图。 EntityCollection.GetList实际上会返回一个不支持排序的IBindingList对象。 因此,默认情况下,EntityCollection的集合视图不支持排序。
显然,仅使用EF导航属性对TreeView模型进行排序是不可能的。除了管理第二个(可排序的)数据结构之外,我仍在寻找解决方法。
默认情况下,WPF项目源绑定回退到'CollectionViewSource.GetDefaultView()'给出的内容(至少在同一个线程中)。你可以尝试在你的实体上递归地添加一个排序描述。 – Uwy
谢谢。我看到应该在ICollectionView中声明GetDefaultView()。当我检查我的CollectionView时,虽然没有这样的方法,但它也不存在于ICollectionView接口中。 – telandor
我不确定你没有得到什么,所以我在一个答案中做了一个示例代码,让你知道我的意思 – Uwy