2011-01-19 2 views
3

Я пытаюсь реализовать поиск по мере ввода экран в моем приложении Silverlight. Идея состоит в том, что у меня есть экран с элементом управления textedit и списком. Список заполняется всеми моими данными.Реализация "Поиск по мере ввода" в Silverlight

Когда пользователь вводит что-то в текстовом поле происходит следующее:

  • Все элементы, которые не содержат все буквы из пользовательского ввода скрыты.
  • Соответствующие буквы элементов видимого списка выделены другим цветом.

Я не уверен, как начать с этого, поэтому все указатели, образцы и подсказки приветствуются!

ответ

7

Я бы предложил использовать CollectionViewSource. У CollectionViewSource есть возможность фильтровать элементы. Вы можете связать свой ListBox с CollectionViewSource и обработать событие Filter, чтобы выполнить фильтрацию. Привяжите «поле поиска» к свойству Text, которое вы можете использовать в своем событии Filter. Вы можете обработать событие «KeyUp» элемента управления TextBox, чтобы начать фильтрацию, вызвав метод Refresh в представлении CollectionViewSource.

Фильтрация данных с помощью CollectionViewSource: http://xamlcoder.com/blog/2010/10/27/filtering-data-using-collectionviewsource/

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.filter.aspx

http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionview.aspx

http://timheuer.com/blog/archive/2009/11/04/updated-silverlight-3-datagrid-grouping-data-pagedcollectionview.aspx

http://bea.stollnitz.com/blog/?p=392

Судо код:

// ViewModel - properties should fire NotifyPropertyChanged 
public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel 
    { 
    this.Data = new CollectionViewSource(); 
    this.Data.Source = this.GenerateObjects(); 
    this.Data.Filter += (s,e) => 
    { 
     // TODO: add filter logic 
     DataObject item = e.Item as DataObject; 
     return item.Name.Contains(this.SearchText); 
    }; 
    } 
    public string SearchText{get;set;} 
    public CollectionViewSource Data {get;set;} 

    private List<DataObject> GenerateObjects(){ // generate list of data objects } 
} 

// View XAML 
<StackPanel> 
    <TextBox Text="{Binding SearchText, Mode=TwoWay}" KeyUp="OnKeyUp"/> 

    <ListBox ItemsSource="{Binding Data.View}"/> 
</StackPanel> 


// View Code Behind 
public class View : UserControl 
{ 
    public View() { this.DataContext = new ViewModel(); } 

    private ViewModel ViewModel { get { return this.DataContext as ViewModel; } } 

    private OnKeyUp() 
    { 
    this.ViewModel.Data.View.Refresh(); 
    } 
} 
+0

@Joe Это выглядит очень хорошо. Есть ли у вас какие-либо идеи, как выделить буквы в элементах, которые находятся в моей строке поиска? – gyurisc

+2

Да, вы можете использовать выделение TextBlock Джеффом Уилкокс. http://www.jeff.wilcox.name/2009/08/sl3-highlighting-text-block/ –

+0

Удивительно, большое спасибо за предложение подсветки textblock – gyurisc

3

Возможно, вы захотите начать с AutocompleteBox от Silverlight Toolkit.

У этого есть несколько удобных точек, где вы сможете расширить его функциональность, например, в экземпляре, который ищет ваш пул значений.

+0

Hi Ralph! Спасибо за подсказку. Я это попробую. Моя единственная проблема с этим, что мне нужно изменить это из combobox в редактирование и элемент управления списком. Я дам ему попробовать. – gyurisc

+1

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

Смежные вопросы