2017-02-18 3 views
0

Я бы хотел связать два приложения CollectionViewSource s в приложении WPF. Есть ли способ сделать следующее:Chaining CollectionViewSource

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

Это в основном экстракт более сложного дерева объектов. Представьте себе элемент управления A, который фильтрует свои данные через CollectionViewSource и передает его в ItemsSource элемента управления B. Он работает, пока управление B не попытается выполнить собственную фильтрацию, группировку или сортировку, привязывая свой ItemsSource к собственному CollectionViewSource. –

ответ

1

CollectionViewSource не фильтрует его коллекции источника, он фильтрует вид. Всякий раз, когда вы привязываетесь к некоторому набору данных в WPF, вы всегда привязываетесь к автоматически генерируемому представлению, а не к самой коллекции исходного кода. Вид - это класс, который реализует интерфейс System.ComponentModel.ICollectionView и предоставляет функции для сортировки, фильтрации, группировки и отслеживания текущего элемента в коллекции.

Таким образом, вместо того, чтобы пытаться «цепочка» два CollectionViewSources вместе, вы должны привязать их к одной и той же исходной коллекции:

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

Они могут затем фильтровать мнения независимо друг от друга.

Если вы хотите применить фильтры управления B на верхней части фильтров контролируете, вы должны реализовать эту логику в обработчик Filter событий в CollectionViewSource, например:

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 не поддерживается свойством Source CollectionViewSource. –