2014-09-04 71 views
2

这是一个双人单位。如何在ItemsControl中实现自定义内联搜索?

首先,在WPF中,标准的ListBox控件自动支持对其项目进行内联搜索。它通过使用项目的ToString函数来实现这个功能,这意味着如果你有焦点放在列表框中并开始输入,它将执行最左边的搜索,突出显示任何ToString与你输入的内容相匹配的项目。在短时间内随后的按键添加到搜索字符串中(即,键入'A'后跟'S'将向左搜索'AS',而打印'A'然后暂停,然后键入'S'搜索'S'

问题是这个机制似乎完全依赖于ToString返回的值,在某些情况下我们不能依赖这个值。是否还有别的东西可以用来代替ToString ?

第二部分是行为似乎只出现在ListBox中,但没有其他ItemsControl对象(或像TreeView那样的分层结构)。不必从头开始重新编写该功能,是否有简单的方法将它添加到ItemsControl?

+0

我会说不。 'ListBox's通常在其中包含文本,所以这些功能是合乎逻辑的,但ItemsControl通常意味着它们中有对象,因此'ItemsControl'中的默认搜索功能不那么合乎逻辑。你只需要对数据进行一些基本的过滤......它应该占用10行以上的代码,所以这并不困难。 – Sheridan 2014-09-04 15:16:23

+0

我的问题的第一部分是什么......这将有助于解决第二部分问题。而你的回应完全忽略了与ListBox一起使用的数据模板。即使使用DisplayMember,也会隐含地创建一个与ToString不同步的数据模板,这种功能可能无用,更不用说混淆于获得奇数选择(而不是过滤)行为的用户,他们不知道为什么。 – MarqueIV 2014-09-04 15:21:30

回答

5

您可以控制使用TextSearch.TextTextSearch.TextPath附加属性搜索的内容。 (见http://msdn.microsoft.com/en-us/library/system.windows.controls.textsearch(v=vs.110).aspx

您可以申请TextSearch.TextPathListBox实例(所以搜索此属性,而不是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后裔其他例子与搜索:ComboBoxDataGrid)。您可以将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