代码之家  ›  专栏  ›  技术社区  ›  Julian Lettner

wpf:在布尔属性上绑定/应用筛选器

  •  1
  • Julian Lettner  · 技术社区  · 15 年前

    我想对 ListBox 因此 IsSelected 财产 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/可以实现这一点吗?

    谢谢你的时间。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Charlie    15 年前

    我唯一能想到的方法就是 ObjectDataProvider 两个分开的 CollectionViewSource xaml中的对象。一个视图将应用筛选器,另一个视图则不会。然后你可以直接绑定到 CheckBox.IsChecked 属性和使用自定义 IValueConverter . 值转换器将有两个依赖属性-都是类型 CollectionViewSource. 这些属性可以称为, 未筛选 “和” 过滤岩 。在xaml中,您可以将unfiltered items属性设置为 集合ViewSource 这是未筛选的,筛选项属性设置为具有筛选器的项。转换器逻辑本身很简单-如果为true,则返回经过筛选的 集合ViewSource ,如果为false,则返回未过滤的。

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