2013-04-18 19 views
7

ハードドライブ上のディレクトリとファイルをモデル化したツリービューを作成しました。各treeviewItemにはisSelectedプロパティにバインドされたチェックボックスがあります。私が達成したいのは、各親ノードの合計ファイル数(選択された合計12個の10/12個の10個のファイル)に選択されたファイルの数を表示することです。コレクションをItemsSourceにバインドするときにそれをフィルタリングする方法は?

プロパティがどこにバインドする方法はありますか?

<ContentPresenter Content="{Binding MyItems.Count where MyItems.IsSelected, Mode=OneTime}" 
        Margin="2,0" /> 
+1

MVVMを使用していますか? – DHN

+1

私はDHNです。 –

+1

ViewModelsまたはツリービューにバインドされたクラスを投稿できます – Jehof

答えて

11

バインディング内のコレクションを直接フィルタリングする方法はありません。ただし、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といえ...

+0

コードビハインド部分のためにダウン投票しました –

+1

これを単体テストする必要はないと思います... – Marc

+0

何ですか?これをユニットテストする必要はありませんか?次に、この 機能が機能することを確認しますか?自動UIテスト?これはViewModelの特権であり、Viewのものではなく、現在の選択肢を含むものです。 –

-9

を知っていることはありません。 WrappingCollection.WithSelectionをItemsSourceとして使用する 表示する値としてSelectionCountを使用します。 フレームワークを使用しない場合は、変更された選択イベントを専用の動作で登録し、専用の依存関係プロパティを作成し、選択が変更されるたびに更新する必要があります。

最後に1つ:コードビハインドの使用は絶対に避けてください。それはMVVMの原則全体を破ります。

+4

-1 - *コードビハインドの使用は絶対に避けてください。* - さあ、それは単に真実ではありません。必要に応じて、コードを使用することができます。 'CustomControl'を考えれば、コードなしで実装することはできません。しかし、コードビハインドが最も簡単な解決策である場合、さまざまな理由があります。 **あなたがコードを使用するのを避けることができるときに**試してみてください。**、私はあなたと一緒にいます。 – DHN

+0

+1のDHNについては、自分自身をかなりMVVMの原理主義者だと考えますが、それは間違いありません。ビヘイビアは、codebehind by btw以外の何ものでもありません。 – Marc

+0

私は、UserControl(別名ビュー)から派生したコントロールとControl(別名カスタムコントロール)から派生したコントロールを区別します。私がコードビハインドを話すとき、私はコードビハインドだけを参照します。また、ビューの場合、コードビハインドを避けなければなりません。 コードビハインドの上に構築されている場合、どのようにテストしますか? 実装しようとしている機能が純粋なビジュアルビヘイビアである場合は、それをコードビハインドで実装するのと同じです(XAMLで行うことも、ビヘイビアに委譲することもできるので、これは必要ありません)。それが何か他のものなら、間違っているよ。 –

関連する問題