using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Core2022.SO.nojob
{
public enum TypeEnum
{ A, B, C }
public class RowEntity
{
public string Name { get; set; } = string.Empty;
public TypeEnum Type { get; set; }
}
public class TableVM
{
public ObservableCollection<RowEntity> Rows { get; } = new();
public TypeEnum? SelectedType { get; set; }
public static IReadOnlyList<TypeEnum> Types { get; } = Array.AsReadOnly((TypeEnum[])Enum.GetValues(typeof(TypeEnum)));
}
}
private void OnComboBoxSelectedItemChanged(object sender, EventArgs e)
{
var comboBox = sender as ComboBox;
var selectedColumnValue = comboBox.SelectedItem as string;
// ICollectionView.Filter is of type 'Predicate<object>',
// so we can assign a simple lambda expression as filter predicate.
// The predicate must return 'true' if the tested item must be displayed.
this.DataGridView.Items.Filter = item => (item as MyRowItem).Type == selectedColumnValue;
}
2条答案
按热度按时间lzfw57am1#
示例:
hrysbysz2#
您总是通过将筛选器表达式分配给其关联的
ICollectionView.Filter
属性来筛选ItemsControl
(如DataGrid
)。为此,您可以通过访问
ItemsControl.Items
属性来检索ItemsControl
的ICollectionView
(如果您可以直接访问ItemsControl
示例)。否则,您可以始终使用静态帮助器方法
CollectionViewSource.GetDefaultView(mySourceCollection)
,这当然需要直接引用源集合(例如在数据绑定场景中)。假设您有一个
ComboBox
来选择筛选 predicate ,例如string
值或enum
值(无论Type
属性/列的数据类型是什么),以及DataGrid
,其通过绑定到具有属性Name
,Content
,Type
和Exceptions
,一个非常简单的解决方案可以如下所示:在代码隐藏中处理
ComboBox.SelectionChanged
事件理解集合视图的概念很重要。WPF绑定引擎将引用集合的集合视图,而不是集合本身:集合视图。
即使您在本地分配源集合,而没有任何数据绑定到
ItemsControl.ItemsSource
,ItemsControl
也会在内部向绑定引擎注册该集合,以便跟踪更改。因此,为了提高性能,您应该始终将实现
INotifyCollectionChanged
的集合(例如ObservableCollection
)分配给ItemsControl.ItemsSource
属性。