从共享过滤器停止ItemsControls

时间:2009-06-30 22:41:26

标签: c# wpf xaml

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

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

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

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

有人能告诉我如何让我的自定义控件中的过滤器影响列表视图中的项目吗?

2 个答案:

答案 0 :(得分:2)

我能想到的第一件事就是,不需要对你所描述的内容进行任何更大的修改,只需将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];
    }
}

答案 1 :(得分:0)

此组件

http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/

能够过滤两个WPF项目控件,两者都绑定到同一数据源而不受任何干扰!

他是完整的XAML声明,没有C#代码!

希望这会有所帮助!