我有一个 UserControl 显示一些应该被过滤的集合,但传递给控件的集合可能会在主窗口中被过滤。它看起来像这样:
Window1.xaml
<Window x:Class="CollectionViewSourceTesting.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CollectionViewSourceTesting="clr-namespace:CollectionViewSourceTesting"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<CollectionViewSource Source="{Binding Data}" x:Key="ItemsViewSource" Filter="CollectionViewSource_Filter" />
</Window.Resources>
<Grid>
<CollectionViewSourceTesting:UserControl1 DataContext="{Binding Source={StaticResource ItemsViewSource}}" />
</Grid>
</Window>
UserControl1.xaml
<UserControl x:Class="CollectionViewSourceTesting.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
<Grid.Resources>
<CollectionViewSource Source="{Binding}" x:Key="cvs" Filter="CollectionViewSource_Filter" />
</Grid.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource cvs}}" />
</Grid>
</UserControl>
这不起作用,因为 CollectionViewSource.Source 不接受 ListCollectionView,它会引发异常“'System.Windows.Data.ListCollectionView' 不是属性 'Source' 的有效值。”。
我想我可以在 UserControl 中使用 DataContextChanged 事件来手动向 ListCollectionView 添加过滤,但这不会是嵌套的,我还需要手动设置 ListBox.ItemsSource 属性。我将使用现有视图并更改 Filter 属性。我想做的是使用 CollectionViewSource 创建另一个视图,以便我可以放入 xaml。那可能吗?
我希望我的 UserControl 能够处理普通集合以及 CollectionViews。