Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ItemsControl中实现自定义内联搜索?_C#_Wpf_Search_Listbox_Itemscontrol - Fatal编程技术网

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

C# 如何在ItemsControl中实现自定义内联搜索?,c#,wpf,search,listbox,itemscontrol,C#,Wpf,Search,Listbox,Itemscontrol,这是一个由两部分组成的系统 首先,在WPF中,标准ListBox控件自动支持对其项的内联搜索。它通过使用items的ToString函数来实现这一点,这意味着如果您将焦点放在列表框中并刚开始键入,它将执行最左侧的搜索,突出显示ToString与您键入内容匹配的任何项目。短时间内的后续按键将添加到搜索字符串中(即键入“a”后再键入“S”将左键搜索“AS”,而键入“a”后暂停,然后键入“S”将左键搜索“S”) 问题是,这种机制似乎完全依赖于ToString返回的值,在某些情况下,这是我们无法依赖的。

这是一个由两部分组成的系统

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

问题是,这种机制似乎完全依赖于ToString返回的值,在某些情况下,这是我们无法依赖的。是否还有其他东西可以替代ToString


第二部分是,行为似乎只出现在列表框中,而没有其他ItemsControl对象(或树状视图之类的分层对象)无需从头开始重新编写该功能,是否有一种简单的方法将其添加到ItemsControl?

您可以使用
TextSearch.Text
TextSearch.TextPath
附加属性控制搜索内容。(请参阅)

您可以将
TextSearch.TextPath
应用于您的
ListBox
实例(因此它搜索此属性而不是
ToString
),也可以将
TextSearch.Text
应用于单个
ListBoxItem
子对象(这样您就可以为单个元素设置单个搜索文本)


按单个值进行搜索(英文数字):
1.
2.
3.
4.
此行为在
ItemsControl
类中实现(您可以通过搜索找到
ItemsControl
子体的其他示例:
ComboBox
DataGrid
)。您可以将
IsTextSearchEnabled
属性设置为true以使其工作。(请参阅)


单级搜索适用于
TreeView
。如果要执行多级搜索,我认为应该以编程方式实现搜索。(请参阅)

我不这么认为。
ListBox
es通常包含文本,因此功能是合乎逻辑的,但是
ItemsControl
s通常意味着其中包含对象,因此
ItemsControl
中的默认搜索功能不太合乎逻辑。您只需要对数据进行一些基本的筛选……它应该需要10个以上的时间代码行左右,所以不难。我问题的第一部分如何?这有助于解决第二部分。您的回答完全忽略了列表框中经常使用的数据模板。即使使用DisplayMember,也会隐式创建一个与ToString呈现该功能不同步的数据模板这根本没用,更不用说让用户感到困惑了,因为用户有奇怪的选择(不是过滤)行为,他们不知道为什么。
<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>