我有一个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>
我已经尝试了很多东西。但我只想保留一个简单的东西:文本框,如果你填写一些字母,程序必须过滤这个字母组合存在的位置。谁知道一个简单的解决方案或例子?
谢谢!
答案 0 :(得分:4)
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和“绑定”兼容;)
你可以找到带有示例的代码源(更多帖子将会更深入到组件中)
优势在于您不必关心集合视图管理,从而将您的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>