【问题标题】:How do you implement custom inline searching in an ItemsControl?如何在 ItemsControl 中实现自定义内联搜索?
【发布时间】:2014-10-29 09:28:56
【问题描述】:

这是一个两部分。

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

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

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

【问题讨论】:

  • 我会说不。 ListBoxes 通常在其中包含文本,因此功能是合乎逻辑的,但ItemsControls 通常意味着其中包含对象,因此ItemsControl 中的默认搜索功能不太合乎逻辑。你只需要对你的数据做一些基本的过滤......它应该需要10多行代码左右,所以并不难。
  • 我的问题的第一部分怎么样......这将有助于解决第二部分。而且您的响应完全忽略了经常与 ListBox 一起使用的数据模板。即使使用 DisplayMember 也会隐式创建一个与 ToString 呈现不同步的数据模板,该功能可能毫无用处,更不用说让用户感到困惑,因为他们的选择(而不是过滤)行为很奇怪,他们不知道为什么。

标签: c# wpf search listbox itemscontrol


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多