【问题标题】:Simple WPF combobox filter简单的 WPF 组合框过滤器
【发布时间】:2015-12-20 15:17:54
【问题描述】:

我已经在 Google 上搜索了一个简单的解决方案,但没有运气。我有一个标准的 WPF 组合框,我只是希望能够在组合框具有焦点时根据用户键入的前 2 个或 3 个字母来过滤显示的列表。我尝试了一些编码,包括一些 Lamba 表达式,但错误“System.NotSupportedException”一直在指定“combobox.Items.Filter”的行上抛出。我没有使用 MVVM,只是希望用户可以使用这个简单的功能。请帮忙!附言IsEditable、IsTextSearchEnabled 和 StaysOpenOnEdit 属性设置为 true,但尚未实现所需的功能。

【问题讨论】:

  • 你想让程序从程序中的可用列表中预测 na ..
  • 组合框使用数据表填充,但列表有几百个选项。因此,当用户键入几个字符时,我需要缩短列表并打开以供选择。
  • 我认为查询检查有一些错误...link
  • 对不起,我没有关注,您要查询什么?
  • 检查那个链接....我认为你有类似的问题

标签: c# wpf combobox


【解决方案1】:

我开发了一个示例应用程序。我使用字符串作为记录项,您可以使用自己的实体来完成。退格也可以正常工作。

 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 + "*'"); 
             */
          }
     }

XAML

<ComboBox x:Name="Cmb"
          IsTextSearchEnabled="False"
          IsEditable="True"
          ItemsSource="{Binding DataSource}"
          Width="120"
          IsDropDownOpen="True"
          StaysOpenOnEdit="True"
          KeyUp="Cmb_KeyUp" />

【讨论】:

  • 通过这两个回复,我仍然得到“System.NotSupportedException”。我什至尝试创建一个从组合框继承的自定义控件,但仍然出现相同的错误。是否有任何人都可以推荐的第三方工具?这让我发疯了!
  • @BabyDoll 你一定是在做傻事。您可以在 dropbox.com 上传您的代码并分享链接。
  • 我也这么认为!!也许值得一提的是,我是直接从数据表绑定的? WPF 的初学者,所以我确信我缺少一些愚蠢的东西。我在某处读到数据表不支持过滤(我这样做的方式),但这不是我应该首先使用 ICollectionView 的原因吗?
  • @BabyDoll 你在'itemsViewOriginal`中得到了什么CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);
  • 当我调试时,我看到数据表的内容具有正确的数据。我突然想到了一些事情;我正在尝试过滤数据,但我没有指定要使用的列....这是我的问题吗?如果是这样,我如何指定用于过滤的列?
【解决方案2】:

我认为 CollectionView 是您正在寻找的。​​p>

  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
  }

您想使用“ClassesCollectionView”作为您的 Combobox 的 ItemsSource

【讨论】:

  • 感谢您的回复!但我仍然在指定 combobox.Items.Filter 的行上收到错误。
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 2020-04-01
  • 1970-01-01
  • 2017-09-02
  • 2013-01-23
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多