私はこのデータを含む仮想ツリービューを持っています:ICollectionViewを使用してwpfツリービューの階層をフィルタリングする方法は?
RootNode
Leaf
vein
SecondRoot
seeds
flowers
特定のテキストを含むノードだけを表示するために、ノードをフィルタリングしようとしています。 "L"を指定すると、ツリーはフィルタリングされ、RootNode-> LeafとSecondRoot-> flowers(両方に文字Lが含まれているため)だけが表示されます。
MV-VMのパターンに続いて、私はこのような基本的なTreeViewViewModelクラスを持っている:
public class ToolboxViewModel
{
...
readonly ObservableCollection<TreeViewItemViewModel> _treeViewItems = new ObservableCollection<TreeViewItemViewModel>();
public ObservableCollection<TreeViewItemViewModel> Headers
{
get { return _treeViewItems; }
}
private string _filterText;
public string FilterText
{
get { return _filterText; }
set
{
if (value == _filterText)
return;
_filterText = value;
ICollectionView view = CollectionViewSource.GetDefaultView(Headers);
view.Filter = obj => ((TreeViewItemViewModel)obj).ShowNode(_filterText);
}
}
...
}
そして、基本的なTreeViewItemViewModel:
public class ToolboxItemViewModel
{
...
public string Name { get; private set; }
public ObservableCollection<TreeViewItemViewModel> Children { get; private set; }
public bool ShowNode(string filterText)
{
... return true if filterText is contained in Name or has children that contain filterText ...
}
...
}
すべてがXAMLで設定があるので、私は、ツリービューを参照してください検索ボックス。
このコードを実行すると、フィルターはルートノードにのみ不十分です。私の述語がすべてのノードに対して呼び出されるように、ノードの階層内でフィルタを細かくする方法がありますか?言い換えれば、フィルタは全体としてTreeViewに適用できますか?
?あなたが中継することができる、または他の解決方法のパフォーマンス情報? –