这是一个两个部分。
首先,在WPF中,标准ListBox控件自动支持其项目的内联搜索。它通过使用项目' ToString函数,意味着如果您将焦点放在列表框中并且只是开始键入,它将执行最左侧搜索,突出显示其ToString与您键入的内容匹配的任何项目。在短时间内进行的后续按键会添加到搜索字符串中(即键入' A'然后' S'将左键搜索' AS'而typign ' A'然后暂停,然后键入' S'而是左搜索' S'
问题是这个机制似乎只依赖于ToString返回的值,在某些情况下,这是我们无法依赖的。我们可以使用其他东西而不是ToString吗?
第二部分是行为似乎只存在于ListBox中,但没有其他ItemsControl对象(或像TreeView这样的分层对象。)无需从头开始重写该功能,是否有一种简单的方法将它添加到ItemsControl?
答案 0 :(得分:5)
您可以使用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 XPath=@Name}" /> <Run Text="{Binding XPath=@Surname}" />
</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)