1

我想ListBox根据 a 的IsSelected属性将过滤器应用于 a CheckBox

目前我有这样的事情。
XAML

<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 ...
    }

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

问题:
是否可以使用 XAML 中的 Bindings / 来实现这一点?

谢谢你的时间。

4

1 回答 1

0

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

这个解决方案不是很优雅,但它可以完成工作。因为Filter不是 aDependencyProperty并且只能由事件处理程序指定,所以我们的手有点绑在这个上。不过,我不认为你的解决方案是一个坏的。

于 2010-04-22T18:43:20.343 回答