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