Ho una ipotetica struttura ad albero che contiene questi dati:Come filtrare una gerarchia di treeview wpf usando un ICollectionView?
RootNode
Leaf
vein
SecondRoot
seeds
flowers
Sto cercando di filtrare i nodi al fine di mostrare solo i nodi che contengono un certo testo. Se aggiungo "L", l'albero verrà filtrato e mostrerà solo RootNode-> Leaf e SecondRoot-> flowers (poiché entrambi contengono la lettera L).
Seguendo il modello MV-VM, ho una classe base TreeViewViewModel come questo:
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);
}
}
...
}
E un TreeViewItemViewModel base:
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 ...
}
...
}
Tutto è messa a punto nel XAML in modo da vedere la vista ad albero e casella di ricerca.
Quando si esercita questo codice, il filtro si applica solo ai nodi di radice che sono insufficienti. C'è un modo per far scorrere il filtro verso il basso nella gerarchia dei nodi in modo che il mio predicato sia chiamato per ogni nodo? In altre parole, il filtro può essere applicato al TreeView nel suo insieme?
Cosa si finisce per fare ? Qualche informazione sulle prestazioni che puoi trasmettere o altra soluzione? –