使用wpf在列表框中搜索
本文关键字:搜索 列表 wpf 使用 | 更新日期: 2023-09-27 17:49:45
我有一个listview,绑定了一个对象的可观察集合。这里的宾语是"questions"。我想实现一种搜索引擎。在文本框之类的。但是我有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>
我已经尝试了很多事情。但我只想保留一个简单的东西:一个文本框,如果你在里面填一些字母,程序必须过滤这些字母的组合存在的地方。有人知道一个简单的解决方案或例子吗?
谢谢!
请查看CollectionViewSource
1)创建CollectionViewSource:
private readonly CollectionViewSource viewSource = new CollectionViewSource();
2)设置你的列表作为来源:
viewSource.Source = list;
3)在ListView中设置viewsource
当你这样做了,你可以使用过滤器属性:viewSource.Filter = FilterResults;
private bool FilterResults(object obj)
{
//match items here with your TextBox value.. obj is an item from the list
}
5)最后将viewSource的刷新方法放在过滤器TextBox的TextChanged上:
void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
viewSource.Refresh();
}
希望这对你有帮助!
你也可以在你的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");
}
}
在构造函数中,连接视图,并监视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;
}
这是我制作的一个自定义控件,您可以使用它过滤封装任何类型对象的任何类型集合的任何ItemsControls。这比保持代码干净要好:它完全符合XAML声明性和"绑定"兼容;)
http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/你可以找到源代码的例子(更多的帖子将更深入地了解组件)
优点是你不必关心集合视图管理,从而用UI关注污染你的vewmodel(因为你必须面对事实:即使它是在视图模型中完成的,过滤集合主要是一个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>