2015-09-20 28 views
2

我一直在試圖隱藏TreeView的項目。我使用自定義數據類型作爲從FrameworkElement繼承的源(稱爲SettingsMenuItem)(當前是FrameworkContentElement,因爲否則TreeView呈現錯誤)。隱藏TreeView項目

我的目標是通過這些FrameworkElements的VisibilityProperty設置要麼CollapsedVisible我能夠隱藏某些項目(包括子女)。我知道這可以通過從源集合中刪除項目來完成。但那不是我想要的。這意味着我必須對每個集合進行鏡像以便跟蹤它的實際項目,綁定到每個集合以便通知Visibility-更改並在每次更改時創建一個新集合。這很多開銷。

現在我不知道如何才能做到這一點。我認爲它與ItemsGenerator有關,但我沒有看到覆蓋它的行爲的任何可能性。我認爲TreeView能夠檢測可見性,但顯然它沒有。作爲另一種選擇,我想到了一個自定義的TreeViewItem(如果需要的話,甚至可能是TreeView) - 但是在這一點上,整個系統的抽象使我感到壓力。我不知道從哪裏開始,以及解決問題的實際必要性。

提示我必須自己改變或實施將是綽綽有餘。一個完整的解決方案會很好。

+0

需要查看一些代碼來提出修復建議。你有沒有用XAML編寫的HierarchicalDataTemplate可以包含在你的問題中? –

+2

這並不像通常那樣做。通常使用ICollectionView&設置過濾器謂詞來完成過濾。使用TreeView時,這會稍微複雜 - 因爲您需要在每種數據類型中都有一個ICollectionView。您不應該需要從FrameworkElement繼承。除非您正在推出一些與現有TreeView截然不同的瘋狂自定義TreeView,並且您無法通過替換Templates來表示這種差異。但是,我幾乎可以保證,你不需要這樣做。 – user3690202

+0

這就是我一直在尋找的。我已經這麼想過了。我沒有嚴格使用MVVM,但我知道使用TreeViews和其他數據視圖控件並沒有使用它(或至少它的某些事情)是沒有意義的。無論如何,我按照您建議的方式解決了它@ user3690202:我使用了一個CollectionView,它使用每個實例中指定的代理來過濾那些應該隱藏的代理。 – SharpShade

回答

3

你可以使用你的樹數據節點綁定到一個屬性(例如「可見性」)數據觸發做到這一點:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Visibility" Value="Visible" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsVisible}" Value="False"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</TreeView.ItemContainerStyle> 

儘管這在技術上回答你的問題,我會小心的實際去做。 User3690202的評論是正確的,這通常是通過在視圖模型中進行過濾來完成的。

+0

謝謝,我很感激。我使用了使用CollectionViews的建議方法。 – SharpShade

+0

我想補充一點,雖然這是「通常通過在視圖模型中過濾來完成的事情」,但在許多情況下,在視圖中執行操作也是合理的。該視圖負責呈現數據;如果設計師有充分的理由根據一些基本標準來選擇「根本不可能」的選擇(或許用其他方式替代?),那麼這也是公平的。 – Dan