0

MVVM Light で AutoCompleteBox を使用する最善の方法を見つけようとしています。

    public ICommand AutoComplete
        {
            get
            {
                return new RelayCommand<KeyEventArgs>(e =>
                {
                    var txtBox = e.OriginalSource as TextBox;

                    if (e.Key == Key.Unknown)
                    {
                        return;
                    }

                    string autoComplete = txtBox.Text + e.Key;

                    if (autoComplete.Length >= 3)
                    {
                        RestClient c = new RestClient("http://localhost:3333/api/store");
                        RestRequest r = new RestRequest("/GetStoreNames",Method.GET);
                        r.AddParameter("Name", autoComplete);
                        r.AddParameter("Latitude", "49");
                        r.AddParameter("Longitude", "49");
                        var d =  c.BuildUri(r);
                        c.ExecuteAsync(r, response2 =>
                          {
                              var content = response2.Content;
                          });
                    }


                });
            }
        }


    <i:Interaction.Triggers>
                <i:EventTrigger EventName="KeyUp">
                    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoComplete, Mode=OneWay}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>


<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0" VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162" MinimumPopulateDelay="500"/>

上記を行いましたが、いくつか問題があります。

結果を取得したら、オートコンプリート エリアに表示するにはどうすればよいですか?

一度に多くのリクエストを実行するのを遅らせるにはどうすればよいですか? ご覧のとおり、3 文字が入力される前にサーバーにヒットしたくありませんが、その後は公正なゲームです。最初のリクエストが戻ってくる前にサーバーに対して20回のリクエストが行われ、帯域幅が無駄になるのではないかと心配しています。

4

1 に答える 1

1

イベントなどを使用していると思いますKeyDownか?それはあなたがやりたい方法ではありません。AutoCompleteBox Populating代わりに、イベントをバインドしてMinimumPrefixLengthon yourAutoCompleteBoxを 3に設定し、3 人以上のPopulatingキャラクターがいる場合にのみ発生するようにします。コントロールで取得したリストを表示するには、リストをItemsSourceプロパティにバインドしてから、メソッドを呼び出す必要がありますPopulateComeplte()

同様の質問で私の答えをここで見ることができます。

AutoCompleteBoxただし、Web サービスからリストを表示するコントロールをトリガーするには、メソッドを呼び出す必要があるため、MVVM には適していません。MVVM に適したアプローチについては、この記事を参照してください。「ボーナス: MVVM に適した非同期フィルタリング」セクションまでスクロールしてください。

于 2013-06-06T01:55:32.543 に答える