2017-08-08 94 views
0

我正在使用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模型进行排序是不可能的。除了管理第二个(可排序的)数据结构之外,我仍在寻找解决方法。

+0

默认情况下,WPF项目源绑定回退到'CollectionViewSource.GetDefaultView()'给出的内容(至少在同一个线程中)。你可以尝试在你的实体上递归地添加一个排序描述。 – Uwy

+0

谢谢。我看到应该在ICollectionView中声明GetDefaultView()。当我检查我的CollectionView时,虽然没有这样的方法,但它也不存在于ICollectionView接口中。 – telandor

+0

我不确定你没有得到什么,所以我在一个答案中做了一个示例代码,让你知道我的意思 – Uwy

回答

1

(从我以前的评论)

默认情况下,(至少当它是在同一个线程)WPF项目源绑定回退,以什么CollectionViewSource.GetDefaultView()给出。你可以尝试在你的实体上递归地添加一个排序描述。

public class MainWindowViewModel 
{ 

    public void SetupCollectionView(IEnumerable<MyObject> entities) 
    { 
     foreach(var entity in entities) 
     { 
      CollectionViewSource.GetDefaultView(entity) 
       .SortDescriptions.Add(new SortDescription(nameof(MyObject.Header), ListSortDirection.Ascending)); 
      this.SetupCollectionView(entity.Childs); 
     } 
    } 
} 

public class MyObject 
{ 
    public string Header { get; set; } 
    public int AnotherProperty { get; set; } 

    public virtual IEnumerable<MyObject> Childs { get; set; } 
} 
+0

GetDefaultView()在我的情况下返回null。你的案例中的MyObject是什么样的?我相信我错过了一些东西。 – telandor

+0

MyObject只是您典型的递归实体,它只是作为示例在此处提供,它可以是文件系统上的文件夹或数据库中的树节点。 CollectionViewSource.GetDefaultView()返回null通常表示集合为空,或者您正在除UI之外的另一个线程上运行调用,请尝试使用调度程序在主应用程序线程上运行它。 – Uwy

+0

我使用实体而不是实体的EntityCollection作为GetDefaultView()的参数。这就是为什么我得到空。我现在收到了一个ICollection,但它不可排序。我想我必须将EntityCollection转换成一个列表(可排序的东西)并保持两个数据结构是最新的。 – telandor