筛选ComboBox.ItemsSource

时间:2019-01-29 21:39:22

标签: c# wpf xaml filter combobox

我正试图根据绑定到其ComboBox的{​​{1}}字符串,使ItemsSource对其FilterValue进行过滤;控件位于Text的{​​{1}}内部,而后者本身位于CellEditingTemplate内部。这些项目都实现了一个DataGrid接口,该接口保证有一个DataTemplate和一个ICodeName属性,而我正在成功地使用一个利用它们的Code

因此Name的上下文是ItemTemplate,这是一个实现DataGridRow并公开Foo属性(即{{1} }(“ SuggestionBox”是继承INotifyPropertyChanged的用户控件):

Bars

网格行项目类(ICollectionView)公开以下内容:

ComboBox

运行程序时,我可以看到下拉列表中列出的<DataGridTemplateColumn Header="Bar"> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <local:SuggestionBox Text="{Binding FilterValue, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Bars, UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{StaticResource CodeNameDropdownTemplate}"> </local:SuggestionBox> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> ;当我在“建议框”中键入内容时,会遇到Foo设置器中设置的断点-但是从未调用private ICollectionView _bars; public ICollectionView Bars { get { return _bars; } set { if (_bars != value) { _bars = value; _bars.Filter = FilterBars; OnPropertyChanged(); } } } private bool FilterBars(object obj) { var item = (ICodeName)obj; return string.IsNullOrEmpty(FilterValue) || item.Code.Contains(FilterValue) || item.Name.Contains(FilterValue); } private string _filterValue; public string FilterValue { get { return _filterValue; } set { if (_filterValue != value) { _filterValue = value; OnPropertyChanged(); Bars.Refresh(); } } }

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

当我尝试类似的操作时,实际上使用CollectionView会对我产生警告:

System.Windows.Data Warning: 53 : Using CollectionView directly is not fully supported.  The basic features work, although with some inefficiencies, but advanced features may encounter known bugs.  Consider using a derived class to avoid these problems.

您可以执行以下操作,而不是直接实例化CollectionView

Bars = CollectionViewSource.GetDefaultView(codeNames);

这将实例化一个ListCollectionView,它是从CollectionView派生的。顺便说一下,codeNames就是我给您的ObservableCollection<ICodeName>赋予的变量。

最后,即使您正在刷新ICollectionView设置程序中的FilterValue,您仍然需要告诉WPF刷新其视图。换句话说,您需要在PropertyChanged上提高Bars