2015-12-20 2 views
1

Я искал Google для простого решения этого, но не повезло. У меня есть стандартный комбинированный блок WPF, который просто хотел бы фильтровать список, отображаемый в соответствии с первыми двумя или тремя буквами, которые пользователь вводит, когда в поле со списком есть фокус. Я пробовал кодирование, включая некоторые выражения lamba, но ошибка «System.NotSupportedException» продолжает попадать в строку, где указан параметр «combobox.Items.Filter». Я не использую MVVM и просто хотел бы, чтобы эта простая функциональность была доступна для пользователя. Пожалуйста помоги! Постскриптум Свойства IsEditable, IsTextSearchEnabled и StaysOpenOnEdit имеют значение true, но желаемая функциональность еще не достигнута.Простой фильтр combobox WPF

+0

вы хотите, чтобы программа предсказать из списка доступных в программе па .. –

+0

Поле со списком заполняется с использованием таблицы данных, но список имеет пара сотен вариантов. Поэтому, когда пользователь вводит несколько символов, мне нужен список, который нужно укоротить и открыть для выбора. – BabyDoll

+0

Я думаю, что есть некоторая ошибка с запросом проверить это ... [link] (http://stackoverflow.com/questions/25337974/entity-framework-notsupportedexception-in-lambda-expression) –

ответ

12

Я разработал образец приложения. Я использовал строку как запись, вы можете сделать это, используя свою собственную сущность. 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 + "*'"); 
      */ 
      } 
    } 

XAML

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

Output

+0

С обоими ответами я до сих пор получаю «System.NotSupportedException». Я даже попробовал создать настраиваемый элемент управления, наследующий из поля со списком, и все те же ошибки. Может быть, есть сторонний инструмент, который каждый может порекомендовать? Это сводит меня с ума! – BabyDoll

+0

@BabyDoll u должен делать что-то глупое. Вы можете загрузить свой код на сайте dropbox.com и поделиться ссылкой. – AnjumSKhan

+0

Я тоже так думаю !! Возможно, стоит упомянуть, что я привязываюсь непосредственно от данных? Общий новичок в WPF, поэтому я уверен, что есть что-то глупое, что мне не хватает. Я где-то читал, что datatables не поддерживают фильтрацию (как я это делаю), но не потому, что я должен использовать ICollectionView в первую очередь? – BabyDoll

0

Я думаю, что CollectionView - это то, что вы ищете.

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" в качестве ItemsSource для Combobox

+0

Спасибо за ответ! Но я все еще получаю ошибку в строке, где указан параметр combobox.Items.Filter. – BabyDoll