Es gibt keine Möglichkeit, direkt die Sammlung in der Bindung zu filtern. WPF ermöglicht jedoch das Filtern (und Sortieren und Gruppieren) von Sammlungen mit CollectionViewSource
.
Ein Ansatz wäre, eine CollectionViewSource
in den Ressourcen Ihres ItemTemplate
zu definieren, die die ItemsSource
filtert eine die Anzahl der Elemente erhalten, die den Filter durch Bindung an die Count-Eigenschaft dieses CollectionViewSource
passieren. Sie müssen jedoch Ihren Filter in Codebehind definieren. Würde etwa so aussehen:
<TreeView x:Name="Tree" ItemsSource="{Binding Items}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildItems}">
<HierarchicalDataTemplate.Resources>
<CollectionViewSource x:Key="FilteredItems"
Source="{Binding ChildItems}"
Filter="FilteredItems_OnFilter" />
</HierarchicalDataTemplate.Resources>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{} {0} of {1} selected">
<Binding Path="Count" Source="{StaticResource FilteredItems}" />
<Binding Path="ItemsSource.Count" ElementName="Tree" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Und in dem Code-Behind:
private void FilteredItems_OnFilter(object sender, FilterEventArgs e)
{
var item = sender as Item;
e.Accepted = item.IsSelected;
}
Ich habe es nicht getestet, aber es sollte in der Regel arbeiten. Man weiß nie, mit WPF, obwohl ...
Sind Sie mit MVVM? – DHN
In der Tat bin ich DHN. –
Können Sie Ihre Viewmodels oder die Klassen veröffentlichen, die wegen der Code hinter dem TreeView – Jehof