2011-07-28 44 views
1

我正在使用WP7 Silverlight Toolkit中的AutoCompleteBox。我已經看到他們將一個靜態列表(不變的List)的字符串綁定到AutoCompleteBox的例子。但是,是否有示例顯示如何以更動態的方式綁定AutoCompleteBox?我的下面的嘗試繼續拋出一個InvalidOperationException:在CollectionChanged或PropertyChanged事件期間無法更改ObservableCollection。如何將AutoCompleteBox綁定到windows phone中的非靜態列表中

這是我在我的xaml。

<toolkit:AutoCompleteBox x:Name="tbQuery" TextChanged="tbQuery_TextChanged" /> 

在我的代碼隱藏,我已經模擬去數據庫或跨網絡如下。

private void tbQuery_TextChanged(object sender, RoutedEventArgs e) 
    { 
     AutoCompleteBox acBox = sender as AutoCompleteBox; 
     string txt = acBox.Text; 
     if (txt.Length > 0) 
     { 
      //exception thrown below here; 
      //_words is of type ObservableCollection<string> 
      //earlier, acBox.ItemsSource was set to _words 
      _words.Clear(); 
      _words.Add(txt + "a"); 
      _words.Add(txt + "b"); 
      _words.Add(txt + "c"); 
     } 
    } 

我也嘗試過類似的東西,但它沒有工作。拋出相同的InvalidOperationException。

private void tbQuery_TextChanged(object sender, RoutedEventArgs e) 
    { 
     AutoCompleteBox acBox = sender as AutoCompleteBox; 
     string txt = acBox.Text; 
     if (txt.Length > 0) 
     { 
      List<string> list = new List<string>(); 
      list.Add(txt + "a"); 
      list.Add(txt + "b"); 
      list.Add(txt + "c"); 
      //exception thrown below here; 
      acBox.ItemsSource = list; 
     } 
    } 

演示工具包中僅顯示了一個靜態的資源,最例子只是一個靜態列表中顯示。這是因爲AutoCompleteBox不能以動態方式使用嗎?

回答

1

確切地說,在飛行中更改列表的意義何在?自動完成框自動過濾來自給定itemssource的列表。

無論如何,TextChanged首先被調用 AutoCompleteBox試圖過濾掉您的項目。如果您在輸入幾個字符後按下後退按鈕,則會看到您建議的生成項目。

您可能很有可能將AutoCompleteBox重新編程爲您的功能(它是開源的),但我認爲如果您解釋了您的目的會更好,所以我們可以提供更好的建議。

+0

如果我有10,000個字符串的列表(我有更多的),你是說實際加載10,000個字符串並將其綁定到AutoCompleteBox?加載10,000個字符串需要多長時間?這需要多少內存?如果我們能夠檢測到用戶輸入的內容,執行後臺過濾過程,爲用戶界面提供一個新的(和更短的)列表,它會不會更有效率?我想我知道這個AutoCompleteBox不像你的AJAX自動完成小部件那樣動態。如果沒有,我就不會使用它,因爲它不起作用,但對於微不足道的情況,並不會擴展。 – jake

+0

100 * 100 = 10000.在模擬器和真實設備上都是即時的。 (實際上,在真實設備上速度更快)。我已經指出,它**不具備動態綁定的能力(因此我告訴你重新編程它)。但是一次不提取所有數據的想法是愚蠢的。在手機上,一次完成所有事情幾乎總是會有更好的表現。而32GB的內存,你不應該擔心值半字節的字符串。 –

+0

好吧,讓我試試看。謝謝。 – jake

0

那麼你實際上並不需要重新編程AutoCompleteBox。您可以處理Populating事件以將AutoCompleteBox鏈接到動態生成的數據。

This是你在找什麼。這是一個很好的例子,很好的文章。並且,當手動填充操作完成時,請不要忘記調用PopulateComplete()。

您還可以將ItemFilter屬性設置爲用於定義自己的搜索邏輯的自定義過濾器。有關詳細信息,請參見this。請記住將FilterMode設置爲Custom。

相關問題