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

时间:2014-09-04 14:57:20

标签: c# wpf search listbox itemscontrol

这是一个两个部分。

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

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

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

1 个答案:

答案 0 :(得分: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>

此行为在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