如何在ItemsControl中实现自定义内联搜索?

Mar*_*eIV 2 c# wpf search listbox itemscontrol

这是一个两个部分.

首先,在WPF中,标准ListBox控件自动支持其项目的内联搜索.它通过使用项目的ToString函数来实现这一点,这意味着如果您将焦点放在列表框中并且只是开始键入,它将执行最左侧的搜索,突出显示其ToString与您键入的内容匹配的任何项目.在短时间内的后续按键添加到搜索字符串中(即键入'A'后跟'S'将左搜索'AS',而键入'A'然后暂停,然后输入'S'将改为 - 搜索'S'.

问题是这个机制似乎只依赖于ToString返回的值,在某些情况下,这是我们不能依赖的东西.我们可以使用其他东西代替ToString吗?

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

fil*_*hit 5

您可以控制搜索的内容TextSearch.TextTextSearch.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>
Run Code Online (Sandbox Code Playgroud)

此行为在ItemsControl类中实现(您可以ItemsControl使用search 查找其他后代示例:ComboBox,DataGrid).您可以将IsTextSearchEnabledproperty 设置为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)