2011-07-28 8 views
1

私はWP7 Silverlight Toolkitの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

オンザフライでリストを変更するという点はまったく何ですか?オートコンプリートボックスは、指定されたアイテムソースからあなたのリストを自動的にフィルタリングします。

とにかく、の後にTextChangedが最初にと呼ばれ、AutoCompleteBoxがアイテムをフィルタリングしようとしました。数文字を入力した後に戻るボタンを押すと、生成された項目が表示されます。

オートコンプリートボックスを機能(オープンソース)に再プログラムする可能性は非常に高いですが、あなたの目的を説明した方が良いと思いますので、アドバイスをより良くすることができます。

+0

10,000文字列のリストがある場合は、実際に10,000文字列をロードしてAutoCompleteBoxにバインドすると言っていますか? 10,000文字列をロードするのにどれくらい時間がかかりますか?どのくらいのメモリがかかるでしょうか?ユーザーが入力したものを検出し、バックグラウンドのフィルタリングプロセスを実行し、UIに新しい(そしてより短い)リストをフィードする方が効率的ではないでしょうか?私はこのAutoCompleteBoxがあなたのAJAX自動完成ウィジェットのような動的ではないことを理解していると思います。もしそうでなければ、私はそれを使用しません。なぜなら、それは動作しませんが、簡単なケースではスケールされないからです。 – jake

+0

100 * 100 = 10000です。エミュレータと実際のデバイスの両方で即座に実行できます。 (実際には、実際のデバイスではより高速です。)そして、私はすでに**動的にバインドする能力を持っていないことを指摘しました。(なぜ私はそれを再プログラムするように言ったのですか?)しかし、一度にすべてのデータを取得しないという考えは愚かです。電話では、一度にすべてを取得することは、ほとんど常にパフォーマンスが向上します。 32 GBのメモリでは、半分のメガバイトの文字列を心配する必要はありません。 –

+0

私はそれを試してみましょう。ありがとう。 – jake

0

実際、オートコンプリートボックスを再プログラムする必要はありません。 PopCompleteイベントを処理して、AutoCompleteBoxを動的に生成されたデータにリンクすることができます。

Thisはあなたが探しているものです。それは良い例で良い記事です。そして、手動集団操作が完了したときにPopulateComplete()を呼び出すことを忘れないでください。

独自の検索ロジックを定義するカスタムフィルタにItemFilterプロパティを設定することもできます。詳細は、thisを参照してください。 FilterModeをCustomに設定することを忘れないでください。

関連する問題