2016-11-28 2 views
0

Прежде всего: извините за плохой английский, его не мой первый язык.Как фильтровать мои WPF-combobox?

В настоящее время я работаю над проектом, где у меня есть список лиц, которых я хочу перечислить в поле со списком. Я хочу, чтобы combobox получал фильтрацию, так что есть только люди, перечисленные выше для поиска.

Например, если я набираю combobox «Joh», должны быть только люди, которые начинаются с «Joh», таких как «John», «Johann», ....

Следующее, мой combobox не является «редактируемым», как я могу сделать это, чтобы я мог писать в нем? В настоящее время он «заблокирован» ...

Надеюсь, вы понимаете, в чем проблема, и как ее решить!

ответ

1

Так что одна из интересных вещей о WPF заключается в том, что она позволяет связывать. В частности, связывание свойств вашего кода с элементами управления в вашем пользовательском интерфейсе. Таким образом, чтобы иметь отфильтрованный выпадающий я бы связать список любого объекта, вы должны ваш выпадающий список, что-то, как показано ниже:

C#:

private List<Person> myList = new List<Person>(); 
public List<Person> MyList 
{ 
    get { return myList; } 
    set { myList = value; } 
} 

WPF:

<ComboBox Name="cboObjects" ItemsSource="{Binding MyList}"/> 

Это настраивает combobox для привязки к списку. Итак, теперь мы должны отфильтровать его. Поэтому я буду использовать событие KeyDown для запуска каждый раз, когда Combobox вводится в него. Затем во время этого события вы могли бы захватить текст пользователя и попытаться найти что-либо, что соответствует таковому в списке, а затем установить свойство списка равным тому, что было найдено ..

private void cboObjects_KeyDown(object sender, KeyEventArgs e) 
{ 
    string temp = ((ComboBox)sender).Text; 

    var newList = MyList.Where(x => x.Name.Contains(temp)); 

    MyList = newList.ToList(); 
} 

Теперь ваш список объектов для людей был отфильтрован! Хотя есть несколько проблем с этим, так как тот факт, что теперь у вас больше нет вашего первоначального списка. Другое дело, если вы перейдете к этому подходу, ваш пользовательский интерфейс не будет обновляться, если его не сообщают. Поэтому используйте интерфейс INotifyPropertyChanged. Он будет по существу запускать событие в любое время, когда вы обновляете свойство, которое затем указывает вашему пользовательскому интерфейсу снова получить значение.

И, наконец, что касается того, что вы не редактируете, вы можете установить IsReadOnly = false и IsEditable = true!

2

Это действительно встроенный!

Что вам нужно сделать, это установить следующие свойства на вашем ComboBox элемента управления.

<ComboBox ItemsSource="{Binding PersonList}" 
      IsTextSearchEnabled="True" 
      TextSearch.TextPath="Name"/> 

В этом примере предполагается, что у вас есть PersonList типа Person, в котором тип Person имеет свойство Name.

Вы должны установить TextSearch.TextPath в любое свойство, которое вы хотите найти (на основе свойства элементов в вашей коллекции ItemsSource).

Дополнительная информация, см. https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.combobox.istextsearchenabled