Поиск в списке с помощью wpf - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть список, связанный с наблюдаемой коллекцией объектов.Здесь объектами являются «вопросы».Я хочу реализовать своего рода поисковик.В текстовое поле или что-то.Но у меня есть 3 столбца.1 описания, 1 короткого имени и 1 типа вопроса.Вот код моего списка:

 <ListView IsTextSearchEnabled="True"  TextSearch.TextPath="Description" ScrollViewer.CanContentScroll="True" SelectedItem="{Binding Path=SelectedQuestionDragList, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}" dd:DragDrop.IsDragSource="True" 
  dd:DragDrop.IsDropTarget="False"  Margin="0,34,393,333" Background="#CDC5CBC5" ScrollViewer.VerticalScrollBarVisibility="Visible"
                 dd:DragDrop.DropHandler="{Binding}" Name="listbox1" Height="155"  ItemsSource="{Binding AvailableQuestions}" SelectionChanged="listbox1_SelectionChanged">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Verkorte naam" Width="Auto" DisplayMemberBinding="{Binding Path=ShortName}" />
                        <GridViewColumn Header="Omschrijving" Width="Auto" DisplayMemberBinding="{Binding Path=Description}" />
                        <GridViewColumn Header="Type" Width="Auto" DisplayMemberBinding="{Binding Path=Type}" />
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

Я уже много чего перепробовал.Но я просто хочу оставить одну простую вещь: текстовое поле, и если вы заполните там несколько букв, программа должна отфильтровать, где существует эта комбинация букв.Кто-то, кто знает простое решение или пример?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 апреля 2011

Пожалуйста, посмотрите на CollectionViewSource

1) Создайте CollectionViewSource:

private readonly CollectionViewSource viewSource = new CollectionViewSource();

2) Установите ваш список в качестве источника:

viewSource.Source = list;

3) Установите свой источник просмотра на ListView.

4) Когда вы это сделаете, вы можете использовать свойство Filter:

viewSource.Filter = FilterResults;


private bool FilterResults(object obj)
{
    //match items here with your TextBox value.. obj is an item from the list    
}

5) Наконец, поместите метод обновленияиз viewSource на ваш TextChanged вашего фильтра TextBox:

 void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
    viewSource.Refresh();
}

Надеюсь, это поможет!

1 голос
/ 11 апреля 2011

Вот пользовательский элемент управления, с помощью которого вы можете фильтровать любые ItemsControls, инкапсулирующие любой тип коллекции любого типа объектов.Это лучше, чем держать ваш код в чистоте: он заполнен декальтрацией и совместим с «привязкой» XAML;)

http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/

Вы можете найти пример кода с примером (больше постов, которыебудет углубляться в компонент)

Преимущество состоит в том, что вам не нужно заботиться о представлении управления коллекцией и, таким образом, вы будете увлекать свою модель с проблемами пользовательского интерфейса (поскольку вы должны признать правду: даже если это будет сделанос точки зрения модели, фильтрация коллекции (главным образом, пользовательский интерфейс), таким образом, лучше не использовать в виртуальной машине).По крайней мере, поместите эту логику в поведение;)

Вот единственное, что вам нужно, чтобы иметь рабочий фильтр в вашем списке / просмотре списка:

<SmartSearch:SmartSearchRoot x:Name="ss2"    Margin=" 10,0,10,0" >
  <SmartSearch:SmartSearchScope DataControl="{Binding ElementName=YOUR_LISTVIEW_NAME}"  UnderlyingType="{x:Type YOUR_NAMESPACE:YOUR_OBJECT_TYPE}">
     <!-- The list of property on which you want to apply filter -->                    
     <SmartSearch:PropertyFilter FieldName="YOUR_PROPERTY_ONE"  />
     <SmartSearch:PropertyFilter FieldName="YOUR_PROPERTY_TWO" MonitorPropertyChanged=""true"  />
  </SmartSearch:SmartSearchScope>
</SmartSearch:SmartSearchRoot>
1 голос
/ 11 апреля 2011

Вы также можете сделать это в вашей ViewModel.

Сначала свяжите ваш TextBox со свойством в вашей модели представления.Убедитесь, что в вашем XAML вы установили UpdateSourceTrigger на PropertyChanged, чтобы получать обновления при каждом нажатии клавиши.

Text="{Binding Filter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

В вашей модели представления установите свойство и свой CollectionView:

    ICollectionView ViewFilter;


    private string _Filter;

    public string Filter
    {
        get { return _Filter; }
        set
        {
            _Filter = value;
            RaisePropertyChanged("Filter");
        }
    }

В конструкторе подключите представление и следите за измененным свойством событием:

        ViewFilter = CollectionViewSource.GetDefaultView(AvailableQuestion);

        ViewFilter.Filter = delegate(object item)
        {
            AvailableQuestion q = item as AvailableQuestion;
            // Check the value and return true, if it should be in the list
            // false if it should be exclucdd.

        };


        this.PropertyChanged += ((src, evt) =>
        {
            switch(evt.PropertyName)
            {
                case "Filter":
                    ProjectFilter.Refresh();
                    break;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...