2014-02-14 132 views
0

我的問題如下:我得到了一個具有動態深度類別的樹(每個類別可以有子類別以及條目)。HierarchicalDataTemplate - 忽略生成的特定類型

現在我添加了一個HierarchicalDataTemplate類別在TreeView中正確顯示。但是我收到很多空的條目,它們不適用模板(錯誤的類型),但在樹中顯示爲「屍體」。

如何禁止他們從生成過程?因爲它是一棵抽象樹,它們與類別具有相同的基類。所以他們進入樹,因爲樹總是搜索包含類別,條目或兩者兼有的「分支」屬性。

任何想法?我沒有發現TreeView的任何事件,這可能讓我有機會在生成期間跳過各種條目,也沒有模板的任何選項/屬性來這樣做。

詳細描述:我有一個通用的Tree類。這個類有分支類型「A_TreeLeaf」(抽象)。當然樹的泛型類型必須繼承A_TreeLeaf。我的數據是按類別(CategoryTreeLeaf)和Data(DataTreeLeaf)構建的。當然,每片葉子可以有子葉子(分支)。

現在我從數據庫加載我的數據並構建樹。每個類別都有X個子類別。而且每個類別也可以包含一些數據。這種結構對我有很大幫助,因爲我得到了清晰的類別和數據分層結構。這樣它應該可視化給用戶。但我想分開數據和類別。 TreeView應該只顯示類別(通過HierarchicalDataTemplate),而ListView只顯示數據(通過DataTemplate)。 ListView工作正常,但樹顯示了一些「屍體」入口,即DataTreeLeaf實例。

我想過濾一代DataTreeLeafs,或者只是停止顯示它們的TreeView。有沒有「非黑客」解決方案?我不想複製樹並刪除數據樹葉,除非它真的有必要......因爲這會導致大量開銷工作爲我做,並且管理後面的代碼使用真正的樹或可視化與假樹(因爲我需要橋接它在某種程度上改變時會自動更新)。

+0

發佈示例代碼和數據以重現問題。 –

+0

我無法發佈示例代碼。至少不是整個樹/葉類。但我會更新說明更詳細 – SharpShade

回答

1

您有一個獨特的問題...您的層次數據中有一些數據項不想顯示,但由於某些原因無法刪除。如果這總結了你的問題,那麼你做錯了什麼。

在WPF中,您不應該需要從UI中獲取隱藏數據項,而只需將它們放入收藏夾中即可。這聽起來像是你填充你的分層數據的過程是有缺陷的,你最好在源頭修正它,而不是試圖處理它在UI中引起的問題。

如果因爲任何原因無法修復實際過程,那麼您的下一個最佳選擇是在您顯示之前遍歷數據,並簡單地刪除不應存在的所有數據元素。在使用WPF時,最好爲您的UI提供符合目的的數據。

但是,如果出於某種原因,你甚至不能做到這一點,那麼你最後的選擇是簡單地定義一個額外DataTemplate您的抽象基類,就讓它空:

<DataTemplate DataType="{x:Type YourDataTypesPrefix:YourBaseClass}"> 
</DataTemplate> 

當然,您必須爲每個子類型定義DataTemplate s,否則它們也會被渲染爲空。

+0

沒有其他方式嗎?目前的優勢是,我的「樹」在代碼背後需要所有項目才能使所有工作都成功。 UI不應該顯示條目,因爲它們在列表視圖中單獨顯示。如果我現在刪除所有條目,代碼將不起作用,或伴隨着巨大的複雜性。如果我複製樹,刪除條目,然後顯示覆制的樹,它們不再綁定在一起。如果我更改樹,TreeView中沒有任何更改。當然我可以每次複製它,但是這是一個巨大的開銷...(編輯:空DataTemplate不起作用: - /) – SharpShade

+0

您可以添加一個新的屬性到您的節點(樹葉),例如'VisibleData'只返回應該顯示的節點。 Linq查詢來這裏得心應手。一般來說,在MVVM方法中,您可以使用模型,保存數據的對象以及操作它們。在他們之後,您創建了一個稱爲視圖模型的模型的「可顯示版本」。視圖模型適用於UI目的,並且在您的示例中將只公開顯示的數據。 – RoadBump