2011-11-07 3 views
1

私は、ドメインサービスからエンティティを照会することで自分でフィルタリングするObservableCollection ItemsSourceにバインドされたAutoCompleteBoxを持っています。 Jeff WilcoxのブログからのWebサービス呼び出しからPopulatingEventArgs.CancelをTrueに設定するというシナリオを使用しました。コレクションが準備できたら、ACBでPopulateComplete()を呼び出します。Webサービスからの提案をリロードせずにSilverlight AutoCompleteBoxポップアップを再起動

私の目標はマウスオーバー(またはクリック)時にドロップダウンを再び開くことですが、ウェブからすべてのデータを再度読み込むことはありません。答えは、IsDropDownOpenをTrueに設定することでしたが、stackoverflowに関する質問が見つかりました。しかしこの場合、ACBの人口は再び始まり、別のコールがWebサービスに送られます。

もちろん、ユーザーが入力を開始すると、フィルタリングを再度実行する必要があります。 (例:「ric」と入力し、「rice」と「ricin」を選択すると、米を選択しますが、同じコレクションから別のものを選択したい場合は「ricin」とします。あなたはすでにメモリに "ric"を含む提案を持っています。再度ロードする必要はありません。)

IsDropDownOpenを設定する代わりに、単にPopulateComplete()メソッドを呼び出すという別の方法があります。これは私の望むものとまったく同じですが、少し失敗してしまいます。私のACBがフォーカスを失った後、ドロップダウンはマウスオーバー時に再び開かれません。 acbテキストボックスに戻ってクリックしても。

この問題を解決する方法はありますか?また、ACBに初めてフォーカスを当てたときにPopulateComplete()がドロップダウンリストを開くのはなぜですか?または、これは私の運がこのメソッドを呼び出すと、ドロップダウンを再開し、代わりにIsDropDownOpenプロパティを使用する必要があります(afaikこれは私のマウスオーバーでトリガされた偽の投入イベントと、PopulatingEventArgs.Cancelを呼び出す必要があることを示すフラグすぐにPopulateComplete。しかし、私はこれを動作させることができます(まだ試していない)、なぜ単純にPopulateCompleteを呼び出すときにそれを取得しないでください?

答えて

1

まあ、私はテストビットとIsDropDownOpenを試みたが、ほとんど働いていた:

public void FoodBox_Populating(object sender, PopulatingEventArgs e) 
    { 
     e.Cancel = true;    
     if (!testbit) 
     { 
      VM.LoadFoodSuggestions(FoodBox.SearchText); 
     } 
     else 
     { 
      testbit = false; 
      FoodBox.PopulateComplete(); 
     } 
    } 

private void FoodBox_MouseEnter(object sender, MouseEventArgs e) 
    {    
     //FoodBox.PopulateComplete(); not working after acb loses focus...    

     testbit = true; 
     FoodBox.IsDropDownOpen = true;   
    } 

ここでは、オーバーロードの取り込み方法(のObservableCollectionにその結合ので、明示的なのItemsSourceを設定する必要はありませんが)です

これは今までのところうまくいきます。最初にマウスオーバーしてacbを選択すると、testbitがtrueに設定されているため、検索が開始しないというメッセージが表示されます。 したがって、ユーザーがキーボードでテキストを入力するたびにtestbitをfalseに設定して、SearchTextがユーザーによって変更された後に提案が再生成/再ロードされるようにするイベントハンドラを追加しました。ドロップダウン:PopulateComplete()呼び出しはトゥーレにIsDropDownOpenを設定することなく十分ではありません、そしてtrueに、またで指定された時間で約ドロップダウン開口部を遅らせることを設定する理由

private void FoodBox_TextChanged(object sender, RoutedEventArgs e) 
    { 
     testbit = false; 
    } 

私はまだ知りませんMinimumPopulateDelayですが、少なくとも私が望む機能を提供します。 (おそらくacbのソースを掘り下げてこのミステリーに答えるだろう)

基本的なacbで実装されたこの機能は、今後のリリースのコントロールで役立つかもしれない。

関連する問題