2017-08-08 116 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