2014-09-05 28 views
1

假設我有一個Node類過濾在HierarchicalDataTemplate

public class Node 
{ 
    public string Name; 
    public ObservableCollection<Node> SubNodes; 
} 

,並創建下面的XAML可視化Node對象的集合:

<TreeView Name="Tree"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="myNamespace:Node" 
            ItemsSource="{Binding Path=SubNodes}"> 
      <TextBlock Text="{Binding Path=Name}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

在我喜歡寫東西

Tree.ItemsSource = my_Observable_Collection_Of_Nodes; 
代碼隱藏

並享受結果。

現在我想將自己的過濾函數(比如說「MyFilterFun」)應用到樹視圖中的所有節點。爲此我修改HierarchicalDataTemplate喜歡的東西

<HierarchicalDataTemplate DataType="myNamespace:MyClass"> 
    <HierarchicalDataTemplate.ItemsSource> 
     <Binding> 
      <Binding.Source> 
       <CollectionViewSource Source="{Binding Path=SubNodes}" 
        Filter="MyFilterFun"/> 
      </BindingSource> 
     </Binding> 
    <HierarchicalDataTemplate.ItemsSource> 
    <TextBlock Text="{Binding Path=Name}" /> 
</HierarchicalDataTemplate> 

不幸的是,這並不工作,「MyFilterFun」永遠不會被調用。 那麼正確的做法是什麼?

+1

在基礎源類中具有「CollectionViewSource」或「ICollectionView」類型的屬性並與該屬性綁定。 – 2014-09-05 13:31:36

回答

0

這可以通過使用ICollectionView來完成。從你的ObservableCollection,你可以這樣做:

SubNodesCollectionView = CollectionViewSource.GetDefaultView(SubNodes); 
SubNodesCollectionView.Filter = (param) => 
{ 
    return true; 
}; 

然後結合SubNodesCollectionView,而不是子節點。 lambda處理程序將是您可以指定的一種方法,通過而不是僅返回true來過濾每個方法。