我已经在谷歌搜索了一个简单的解决方案,但没有运气.我有一个标准的WPF组合框,我只希望能够根据用户在组合框具有焦点时键入的前2或3个字母来过滤显示的列表.我尝试了一些编码,包括一些lamba表达式,但错误"System.NotSupportedException"不断被抛出指定"combobox.Items.Filter"的行.我没有使用MVVM,只是希望这个简单的功能可供用户使用.请帮忙!PS IsEditable,IsTextSearchEnabled和StaysOpenOnEdit属性设置为true,但尚未实现所需的功能.
Anj*_*han 16
我开发了一个示例应用程序.我使用字符串作为记录项,您可以使用自己的实体来完成.Backspace也能正常工作.
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 + "*'");
*/
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<ComboBox x:Name="Cmb"
IsTextSearchEnabled="False"
IsEditable="True"
ItemsSource="{Binding DataSource}"
Width="120"
IsDropDownOpen="True"
StaysOpenOnEdit="True"
KeyUp="Cmb_KeyUp" />
Run Code Online (Sandbox Code Playgroud)