C# 简单WPF组合框过滤器
我在谷歌上搜索了一个简单的解决方案,但没有找到运气。我有一个标准的WPF组合框,我只想能够根据组合框有焦点时用户键入的前2或3个字母过滤显示的列表。我尝试了一些编码,包括一些lamba表达式,但在指定了“combobox.Items.Filter”的行中不断抛出错误“System.NotSupportedException”。我没有使用MVVM,只是希望用户可以使用这个简单的功能。请帮忙!请注意,IsEditable、IsTextSearchEnabled和StaysOpenOneEdit属性设置为true,但尚未实现所需的功能 我认为CollectionView正是您想要的C# 简单WPF组合框过滤器,c#,wpf,combobox,C#,Wpf,Combobox,我在谷歌上搜索了一个简单的解决方案,但没有找到运气。我有一个标准的WPF组合框,我只想能够根据组合框有焦点时用户键入的前2或3个字母过滤显示的列表。我尝试了一些编码,包括一些lamba表达式,但在指定了“combobox.Items.Filter”的行中不断抛出错误“System.NotSupportedException”。我没有使用MVVM,只是希望用户可以使用这个简单的功能。请帮忙!请注意,IsEditable、IsTextSearchEnabled和StaysOpenOneEdit属性设
public ObservableCollection<NdfClassViewModel> Classes
{
get { return _classes; }
}
public ICollectionView ClassesCollectionView
{
get
{
if (_classesCollectionView == null)
{
BuildClassesCollectionView();
}
return _classesCollectionView;
}
}
private void BuildClassesCollectionView()
{
_classesCollectionView = CollectionViewSource.GetDefaultView(Classes);
_classesCollectionView.Filter = FilterClasses;
OnPropertyChanged(() => ClassesCollectionView);
}
public bool FilterClasses(object o)
{
var clas = o as NdfClassViewModel;
// return true if object should be in list with applied filter, return flase if not
}
公共ObservableCollection类
{
获取{return\u classes;}
}
公共ICollectionView类集合视图
{
得到
{
if(_classesCollectionView==null)
{
buildClasseCollectionView();
}
返回_classesCollectionView;
}
}
私有void buildClasseCollectionView()
{
_ClasseCollectionView=CollectionViewSource.GetDefaultView(类);
_ClasseCollectionView.Filter=FilterClass;
OnPropertyChanged(()=>ClasseCollectionView);
}
公共布尔过滤器类(对象o)
{
var clas=o作为NdfClassViewModel;
//如果对象应该在应用过滤器的列表中,则返回true;如果不在列表中,则返回flase
}
您想使用“ClasseCollectionView”作为组合框的项目资源我开发了一个示例应用程序。我使用字符串作为记录项,您可以使用自己的实体来完成。退格也可以正常工作
public class FilterViewModel
{
public IEnumerable<string> DataSource { get; set; }
public FilterViewModel()
{
DataSource = new[] { "india", "usa", "uk", "indonesia" };
}
}
public partial class WinFilter : Window
{
public WinFilter()
{
InitializeComponent();
FilterViewModel vm = new FilterViewModel();
this.DataContext = vm;
}
private void Cmb_KeyUp(object sender, KeyEventArgs e)
{
CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);
itemsViewOriginal.Filter = ((o) =>
{
if (String.IsNullOrEmpty(Cmb.Text)) return true;
else
{
if (((string)o).Contains(Cmb.Text)) return true;
else return false;
}
});
itemsViewOriginal.Refresh();
// if datasource is a DataView, then apply RowFilter as below and replace above logic with below one
/*
DataView view = (DataView) Cmb.ItemsSource;
view.RowFilter = ("Name like '*" + Cmb.Text + "*'");
*/
}
}
公共类FilterViewModel
{
公共IEnumerable数据源{get;set;}
公共过滤器模型()
{
数据来源=新[]{“印度”、“美国”、“英国”、“印度尼西亚”};
}
}
公共部分类WinFilter:窗口
{
公共WinFilter()
{
初始化组件();
FilterViewModel vm=新的FilterViewModel();
this.DataContext=vm;
}
私有无效Cmb_KeyUp(对象发送方,KeyEventArgs e)
{
CollectionView itemsViewOriginal=(CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);
itemsViewOriginal.Filter=((o)=>
{
if(String.IsNullOrEmpty(Cmb.Text))返回true;
其他的
{
if(((字符串)o).Contains(Cmb.Text))返回true;
否则返回false;
}
});
itemsViewOriginal.Refresh();
//如果数据源是一个DataView,则应用如下所示的RowFilter,并将上面的逻辑替换为下面的逻辑
/*
数据视图=(数据视图)Cmb.ItemsSource;
view.RowFilter=(“名称如“*”+Cmb.Text+“*”);
*/
}
}
XAML
您想让programm从programm na中的可用列表中进行预测。组合框使用数据表填充,但列表中有几百个选项。因此,当用户键入几个字符时,我需要缩短列表并打开以供选择。我认为查询检查时出现了一些错误。。。对不起,我没听清楚,你想问什么问题?检查那个链接。。。。我想你也有类似的问题谢谢你的回复!但是我仍然在指定combobox.Items.Filter的行中得到错误。在这两个回复中,我仍然得到“System.NotSupportedException”。我甚至尝试过创建一个从组合框继承的自定义控件,但仍然出现相同的错误。是否有任何人都可以推荐的第三方工具?这快把我逼疯了@宝贝,你一定在做傻事。你可以在dropbox.com上传你的代码并分享链接。我也这么认为!!也许值得一提的是,我是直接从数据表绑定的?WPF完全是初学者,所以我确信我遗漏了一些愚蠢的东西。我在某个地方读到datatables不支持过滤(我这样做),但这不是我应该首先使用ICollectionView的原因吗?@BabyDoll'itemsViewOriginal`
CollectionView itemsViewOriginal=(CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource)代码>调试时,我看到datatable的内容包含正确的数据。我突然想到一件事;我正在尝试筛选数据,但我没有指定要使用的列…这是我的问题吗??如果是,我如何指定要用于过滤的列?
<ComboBox x:Name="Cmb"
IsTextSearchEnabled="False"
IsEditable="True"
ItemsSource="{Binding DataSource}"
Width="120"
IsDropDownOpen="True"
StaysOpenOnEdit="True"
KeyUp="Cmb_KeyUp" />