c# – 从共享过滤器停止ItemsControls

我有两个ItemsControl,一个是ListView,另一个是我正在开发的自定义控件.

我已将两个控件的ItemsControl.ItemsSource属性设置为相同的IEnumerable对象,在本例中为List.

我将过滤器应用于我的自定义控件的ItemsControl.Items属性(this.Items.Filter = myFilter),我的控件按预期刷新,仅显示与过滤器匹配的项目.

但是,ListView对其ItemsControl.ItemsSource属性使用相同的IEnumerable对象也会刷新,仅显示与我应用于自定义控件的过滤器匹配的项目.

任何人都可以告诉我如何保持我的自定义控件中的过滤器不影响我的列表视图中的项目?

最佳答案 我能想到的第一件事就是,不需要对你所描述的内容进行任何更大的修改就是将ItemsSource集合包装在你被分配的XAML中的CollectionViewSource中.

<DockPanel>

    <Button DockPanel.Dock="Top"
            Content="Filter Lowercase Names"
            Click="OnFilterClick"/>

    <ListView x:Name="uiListView">
        <ListView.Resources>
            <CollectionViewSource x:Key="ItemsCollection"
                                  Source="{Binding Names}" />
        </ListView.Resources>
        <ListView.ItemsSource>
            <Binding Source="{StaticResource ItemsCollection}" />
        </ListView.ItemsSource>
    </ListView>

    <ListBox x:Name="uiListBox"
             ItemsSource="{Binding Names}" />

</DockPanel>

然后是过滤逻辑:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        Names = new List<string>();

        Names.Add("Robert");
        Names.Add("Mike");
        Names.Add("steve");
        Names.Add("Jeff");
        Names.Add("bob");
        Names.Add("Dani");

        this.DataContext = this;
    }
    public List<String> Names { get; set; }

    private void OnFilterClick(object sender, RoutedEventArgs e)
    {
        uiListView.Items.Filter = x => x.ToString()[0] == x.ToString().ToUpper()[0];
    }
}
点赞