2017-02-18 52 views
0

我想在WPF應用程序中鏈接兩個CollectionViewSource。 有什麼辦法可以讓以下事情發揮作用?鏈接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過濾其數據並將其傳遞給控件B的ItemsSource。它的工作原理是控件B將通過將其ItemsSource綁定到其自己的CollectionViewSource來嘗試執行自己的過濾,分組或排序。 –

回答

1

CollectionViewSource不過濾其源集合,它過濾的視圖。無論何時綁定到WPF中的某些數據集合,都始終綁定到自動生成的視圖,而不是綁定到實際的源集合本身。視圖是一個實現接口的類,提供了對集合中的當前項目進行排序,過濾,分組和跟蹤的功能。

因此,而不是試圖「鏈接」兩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

因此基本上沒有辦法鏈接它們,因爲CollectionViewSource的Source屬性不支持ICollectionView。 –