2009-02-03 91 views
1

我試圖實現類似於WPF中的Firefox 3 AwesomeBar的行爲。我有一個ComboBox使用DataTemplate,使下拉看起來像AwesomeBar的下拉菜單,但我不知道如何獲得正確的行爲。FF3類似於WPF的AwesomeBar行爲

我想要發生的是讓用戶輸入他們的搜索到ComboBox的TextBox位,然後逐漸縮小下拉結果。我想我可能會讓數據庫查詢部分工作(因爲結果將來自數據庫),但我想獲得的是用戶開始鍵入時打開的下拉位(就像在Firefox中那樣) 3),然後自動選擇列表中的第一項和列表中的其他項目,以便能夠通過使用箭頭鍵或點擊它們來選擇。

更新:

我現在已經找到了編程的方式來獲得組合框的下拉(使用IsDropDownOpen = TRUE),但我仍然有一些其他問題:

首先當我輸入它會下降,但它不會選擇與我正在輸入的內容最接近的匹配項,其次當我鍵入某些可以自動關閉的項目並運行SelectedItemChanged方法時。我希望它只在我實際點擊它或按下輸入時關閉並運行代碼(而不是使用向上或向下箭頭選擇它)。任何想法如何讓它做我想要的?如果不夠清楚,我可以提供更多信息。

回答

3

你想要的大多數功能已經在ComboBox中。

是否有程序化的方式來告訴ComboBox列表下拉?

是的,你可以通過ComboBox.IsDropDownOpen屬性設置爲真正做到這一點。

有沒有方法可以選擇一個項目,而不必關閉列表併成爲選定的項目?

當您設置IsEditable真正,它會選擇與輸入文本匹配你的第一個項目 - 當你下拉的項目仍然會被選中。本示例不執行從更大的數據集過濾,但它應該讓您開始:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid.Resources> 
     <x:Array x:Key="data" Type="{x:Type sys:String}"> 
      <sys:String>Veni</sys:String> 
      <sys:String>Vidi</sys:String> 
      <sys:String>Vici</sys:String> 
     </x:Array> 
    </Grid.Resources> 
    <ComboBox x:Name="myCombo" ItemsSource="{StaticResource data}" IsEditable="True" PreviewTextInput="myCombo_PreviewTextInput"/> 
</Grid> 

在代碼後面我們打開組合框。您的處理程序也可以在此處執行過濾:

private void myCombo_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    myCombo.IsDropDownOpen = true; 
} 
+0

Thanks.I」我試過了,但是當我輸入一些足夠獨特的東西來直接選擇一個項目時,它似乎沒有下拉。此外,這隻適用於選擇以您正在輸入的字符開頭的項目 - 我想要在整個字符串中進行搜索。任何想法如何改變這一點? – robintw 2009-02-03 22:43:15

0

使用CollectionView訪問您的集合。

ListCollectionView _myCollectionView = new ListCollectionView(someCollection); 

將您的ComboBox綁定到此CollectionView。這將提供一個過濾器機制。實現一個過濾方法(在這個代碼中的SearchText將是你的ComboBox文本...我將這些信息存儲在一個名爲DP和SEARCHTEXT從ComboBox更新):

private bool FilterMethod(string expression) 
{ 

    if (expression != null && this.SearchText != null) 
    { 
      if (expression.ToUpper().Contains(this.SearchText.ToUpper())) 
       return true; 

      else 
       return false; 
    } 

    return true; 
} 

現在,當用戶鍵入的東西,用在此的CollectionView濾波方法:

_myCollectionView.Filter = new Predicate<string>(FilterMethod);