WPF:布尔属性上的绑定/应用筛选器

WPF:布尔属性上的绑定/应用筛选器,wpf,xaml,binding,filter,collectionviewsource,Wpf,Xaml,Binding,Filter,Collectionviewsource,我想根据复选框的IsSelected属性对列表框应用过滤器 现在我有这样的东西。 XAML 代码隐藏 它可以工作,但这个解决方案感觉像是Windows窗体的老式方式 问题: 在XAML中使用Bindings/可以实现这一点吗 谢谢您的时间。我能想到的唯一方法是在XAML中创建一个ObjectDataProvider和两个单独的CollectionViewSource对象。一个视图会应用过滤器,另一个不会。然后,您可以直接绑定到CheckBox.IsChecked属性并使用自定义IValueCon

我想根据复选框的IsSelected属性对列表框应用过滤器

现在我有这样的东西。 XAML

代码隐藏

它可以工作,但这个解决方案感觉像是Windows窗体的老式方式

问题: 在XAML中使用Bindings/可以实现这一点吗


谢谢您的时间。

我能想到的唯一方法是在XAML中创建一个ObjectDataProvider和两个单独的CollectionViewSource对象。一个视图会应用过滤器,另一个不会。然后,您可以直接绑定到CheckBox.IsChecked属性并使用自定义IValueConverter。值转换器将有2个依赖项属性-都是CollectionViewSource类型。这些属性可能被称为UnfilteredItems和FilteredItems。在XAML中,可以将UnfilteredItems属性设置为未过滤的CollectionViewSource,将filtered items属性设置为带有过滤器的属性。转换器逻辑本身很简单-如果为true,则返回过滤后的CollectionViewSource,如果为false,则返回未过滤的CollectionViewSource

这个解决方案不是非常优雅,但它可以完成任务。因为Filter不是DependencyProperty,只能由事件处理程序指定,所以我们的手在这方面有点牵绊。不过,我认为你的解决方案并不坏

<CheckBox Name="_filterCheckBox" Content="Filter list" Checked="ApplyFilterHandler"/>
<ListBox ItemsSource="{Binding SomeItems}" />
    public ObservableCollection<string> SomeItems { get; private set; }

    private void ApplyFilterHandler(object sender, RoutedEventArgs e)
    {
        if (_filterCheckBox.IsChecked.Value)
            CollectionViewSource.GetDefaultView(SomeItems).Filter += MyFilter;
        else
            CollectionViewSource.GetDefaultView(SomeItems).Filter -= MyFilter;
    }

    private bool MyFilter(object obj)
    {
        return ...
    }