2014-09-04 139 views
2

這是一個雙人單位。如何在ItemsControl中實現自定義內聯搜索?

首先,在WPF中,標準的ListBox控件自動支持對其項目進行內聯搜索。它通過使用項目的ToString函數來實現這個功能,這意味着如果你有焦點放在列表框中並開始輸入,它將執行最左邊的搜索,突出顯示任何ToString與你輸入的內容相匹配的項目。在短時間內隨後的按鍵添加到搜索字符串中(即,鍵入'A'後跟'S'將向左搜索'AS',而打印'A'然後暫停,然後鍵入'S'搜索'S'

問題是這個機制似乎完全依賴於ToString返回的值,在某些情況下我們不能依賴這個值。是否還有別的東西可以用來代替ToString ?

第二部分是行爲似乎只出現在ListBox中,但沒有其他ItemsControl對象(或像TreeView那樣的分層結構)。不必從頭開始重新編寫該功能,是否有簡單的方法將它添加到ItemsControl?

+0

我會說不。 'ListBox's通常在其中包含文本,所以這些功能是合乎邏輯的,但ItemsControl通常意味着它們中有對象,因此'ItemsControl'中的默認搜索功能不那麼合乎邏輯。你只需要對數據進行一些基本的過濾......它應該佔用10行以上的代碼,所以這並不困難。 – Sheridan 2014-09-04 15:16:23

+0

我的問題的第一部分是什麼......這將有助於解決第二部分問題。而你的迴應完全忽略了與ListBox一起使用的數據模板。即使使用DisplayMember,也會隱含地創建一個與ToString不同步的數據模板,這種功能可能無用,更不用說混淆於獲得奇數選擇(而不是過濾)行爲的用戶,他們不知道爲什麼。 – MarqueIV 2014-09-04 15:21:30

回答

5

您可以控制使用TextSearch.TextTextSearch.TextPath附加屬性搜索的內容。 (見http://msdn.microsoft.com/en-us/library/system.windows.controls.textsearch(v=vs.110).aspx

您可以申請TextSearch.TextPathListBox實例(所以搜索此屬性,而不是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 [email protected]}" /> <Run Text="{Binding [email protected]}" /> 
        </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