如何在ItemsControl中实现自定义内联搜索?
这是一个双人单位。如何在ItemsControl中实现自定义内联搜索?
首先,在WPF中,标准的ListBox控件自动支持对其项目进行内联搜索。它通过使用项目的ToString函数来实现这个功能,这意味着如果你有焦点放在列表框中并开始输入,它将执行最左边的搜索,突出显示任何ToString与你输入的内容相匹配的项目。在短时间内随后的按键添加到搜索字符串中(即,键入'A'后跟'S'将向左搜索'AS',而打印'A'然后暂停,然后键入'S'搜索'S'
问题是这个机制似乎完全依赖于ToString返回的值,在某些情况下我们不能依赖这个值。是否还有别的东西可以用来代替ToString ?
第二部分是行为似乎只出现在ListBox中,但没有其他ItemsControl对象(或像TreeView那样的分层结构)。不必从头开始重新编写该功能,是否有简单的方法将它添加到ItemsControl?
您可以控制使用TextSearch.Text
或TextSearch.TextPath
附加属性搜索的内容。 (见http://msdn.microsoft.com/en-us/library/system.windows.controls.textsearch(v=vs.110).aspx)
您可以申请TextSearch.TextPath
您ListBox
实例(所以搜索此属性,而不是ToString
),或者你可以申请TextSearch.Text
个人ListBoxItem
子(这样你就可以设置各个元素单独的搜索文本)。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<XmlDataProvider x:Key="Items" XPath="People">
<x:XData>
<People xmlns="">
<Person Name="John" Surname="Smith" />
<Person Name="Andrew" Surname="Johnson" />
<Person Name="Otis" Surname="Everett" />
<Person Name="Jesus" Surname="Osborn" />
</People>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<StackPanel>
<TextBlock Text="Searches by a property (Name):" />
<ListBox ItemsSource="{Binding Source={StaticResource Items}, XPath=*}"
TextSearch.TextPath="@Name">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding [email protected]}" /> <Run Text="{Binding [email protected]}" />
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock>Searches by a individual value (number in english):</TextBlock>
<ListBox>
<ListBoxItem TextSearch.Text="One">1</ListBoxItem>
<ListBoxItem TextSearch.Text="Two">2</ListBoxItem>
<ListBoxItem TextSearch.Text="Three">3</ListBoxItem>
<ListBoxItem TextSearch.Text="Four">4</ListBoxItem>
</ListBox>
</StackPanel>
</Window>
这种行为在ItemsControl
类实现(你可以找到的ItemsControl
后裔其他例子与搜索:ComboBox
,DataGrid
)。您可以将IsTextSearchEnabled
属性设置为true以使其正常工作。 (请参阅http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.istextsearchenabled(v=vs.110).aspx)
单层搜索适用于TreeView
。我认为你应该以编程方式实现搜索,如果你想执行多级搜索。 (见http://social.msdn.microsoft.com/Forums/vstudio/en-US/e6d58fcc-4eaa-4bdc-8621-ce24c8efd330/treeview-textsearch)
我会说不。 'ListBox's通常在其中包含文本,所以这些功能是合乎逻辑的,但ItemsControl通常意味着它们中有对象,因此'ItemsControl'中的默认搜索功能不那么合乎逻辑。你只需要对数据进行一些基本的过滤......它应该占用10行以上的代码,所以这并不困难。 – Sheridan 2014-09-04 15:16:23
我的问题的第一部分是什么......这将有助于解决第二部分问题。而你的回应完全忽略了与ListBox一起使用的数据模板。即使使用DisplayMember,也会隐含地创建一个与ToString不同步的数据模板,这种功能可能无用,更不用说混淆于获得奇数选择(而不是过滤)行为的用户,他们不知道为什么。 – MarqueIV 2014-09-04 15:21:30