バインディング内のコレクションを直接フィルタリングする方法はありません。ただし、WPFでは、CollectionViewSource
でコレクションのフィルタリング(および並べ替えとグループ化)を行うことができます。
一つのアプローチは、ItemsSource
をフィルタリングあなたItemTemplate
のリソースにCollectionViewSource
を定義することです。このCollectionViewSource
のCountプロパティに結合することにより、フィルタを通過する要素の数を取得します。ただし、コードビハインドでフィルタを定義する必要があります。
<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>
そして、分離コードで:
private void FilteredItems_OnFilter(object sender, FilterEventArgs e)
{
var item = sender as Item;
e.Accepted = item.IsSelected;
}
私はそれをテストしていませんが、それは一般的に動作するはずです。このようになります。あなたは、私が個人的に(それがあなたの目的のために十分なようだとしてLogoFX.Miniを使用)すべての要件を満たしているようだ、次のフレームワーク http://logofx.codeplex.com/ を使用し、WPFといえ...
MVVMを使用していますか? – DHN
私はDHNです。 –
ViewModelsまたはツリービューにバインドされたクラスを投稿できます – Jehof