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