【问题标题】:WPF: Bind/Apply Filter on Boolean PropertyWPF:在布尔属性上绑定/应用过滤器
【发布时间】:2010-04-22 18:31:21
【问题描述】:

我想根据CheckBoxIsSelected 属性对ListBox 应用过滤器。

目前我有类似的东西。
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 / 来实现这一点?

感谢您的宝贵时间。

【问题讨论】:

    标签: wpf xaml binding filter collectionviewsource


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 2018-01-31
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多