2017-02-18 13 views
0

CollectionViewSourceをWPFアプリケーションで2つチェーンしたいと思います。 次のようなことをする方法はありますか?連鎖コレクションビューソース

MainWindow.xaml.cs:

using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 

namespace ChainingCollectionViewSource 
{ 
    public partial class MainWindow : Window 
    { 
    public IEnumerable<int> Items => Enumerable.Range(0, 10); 
    public MainWindow() 
    { 
     DataContext = this; 
     InitializeComponent(); 
    } 
    } 
} 

MainWindow.xaml:

<Window x:Class="ChainingCollectionViewSource.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="ItemsViewA" 
           Source="{Binding Items}" /> 
     <CollectionViewSource x:Key="ItemsViewB" 
           Source="{Binding Source={StaticResource ItemsViewA}}" /> 
    </Window.Resources> 
    <ListBox ItemsSource="{Binding Source={StaticResource ItemsViewB}}" /> 
</Window> 
+0

あなたがやろうとしている理由を説明してもらえこの?おそらくもっと良い方法がありますか? – Kelly

+0

これは基本的により複雑なオブジェクトツリーの抽出です。 CollectionViewSourceを介してデータをフィルタリングし、コントロールBのItemsSourceに渡すコントロールAを想像してください。コントロールBが独自のCollectionViewSourceにItemsSourceをバインドして、独自のフィルタリング、グループ化または並べ替えを実行するまで動作します。 –

答えて

1

CollectionViewSourceは、そのソースコレクションをフィルタリングしていない、それはビューをフィルタリングします。 WPFでデータのコレクションにバインドするたびに、常に自動的に生成されたビューにバインドされ、実際のソースコレクション自体にはバインドされません。ビューは、System.ComponentModel.ICollectionViewインターフェイスを実装するクラスであり、コレクション内の現在のアイテムを並べ替え、フィルタリングし、グループ化し、追跡する機能を提供します。

ので、代わりのあなたは同じソースコレクションにバインドしなければならない2つのCollectionViewSourcesを「チェーン化」しようとしている:

<CollectionViewSource x:Key="ItemsViewA" Source="{Binding Items}" /> 
<CollectionViewSource x:Key="ItemsViewB" Source="{Binding Items}" /> 

彼らはその後、互いに独立のビューをフィルタリングすることができます。

あなたがコントロールAのフィルタの上に制御Bのフィルタを適用する場合は、例えば、CollectionViewSourceFilterイベントハンドラでこのロジックを実装する必要があります。

private void ItemsViewA_Filter(object sender, FilterEventArgs e) 
{ 
    e.Accepted = Include(e.Item as YourType); 
} 

private bool Include(YourType obj) 
{ 
    //your filtering logic... 
    return true; 
} 

private void ItemsViewB_Filter(object sender, FilterEventArgs e) 
{ 
    var item = e.Item as YourType; 
    e.Accepted = Include(item) && /* your additional filtering logic */; 
} 
+0

ICollectionViewはCollectionViewSourceのSourceプロパティでサポートされていないため、基本的にはチェーン化する方法はありません。 –