使用wpf在列表框中搜索

时间:2011-04-11 12:27:33

标签: c# wpf search listbox

我有一个listview,与一个可观察的对象集合绑定。这里的对象是“问题”。我想实现一种搜索引擎。在文本框或其他东西。但我有3列。 1个描述,1个短名称和1个问题类型。这是我的listview的代码:

 <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 个答案:

答案 0 :(得分:4)

请查看CollectionViewSource

1)创建一个CollectionViewSource:

private readonly CollectionViewSource viewSource = new CollectionViewSource();

2)将您的列表设置为源:

viewSource.Source = list;

3)在ListView上设置您的viewsource。

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的refresh方法放在过滤器TextBox的TextChanged上:

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

希望这有帮助!

答案 1 :(得分:1)

您也可以在ViewModel中执行此操作。

首先,将TextBox绑定到视图模型中的属性。请务必在XAML中将UpdateSourceTrigger设置为PropertyChanged,以便获得每次击键的更新。

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

在您的viewmodel中,设置您的媒体资源和CollectionView

    ICollectionView ViewFilter;


    private string _Filter;

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

在构造函数中,连接视图,并监视propertychanged事件:

        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;
            }

答案 2 :(得分:1)

这是我使用的自定义控件,您可以使用它来过滤任何包含任何类型对象的任何类型集合的ItemsControl。最好是让你的代码保持清洁:它正在填充XAML decalrative和“绑定”兼容;)

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

你可以找到带有示例的代码源(更多帖子将会更深入到组件中)

优势在于您不必关心集合视图管理,从而将您的vewmodel与UI问题联系起来(因为您必须面对事实:即使在视图模型中完成,过滤集合主要是因此,UI最好不要在VM中。至少,将该逻辑置于行为中;)

以下是您在listbox / listview上使用过滤器所需的唯一内容:

<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>