如何在MVVM Light中使用AutoCompleteBox?

时间:2013-06-05 16:43:55

标签: windows-phone-7 mvvm-light silverlight-toolkit

我正在试图弄清楚如何将AutoCompleteBox与MVVM Light一起使用。

    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次请求。

1 个答案:

答案 0 :(得分:1)

我假设您正在使用KeyDown事件或类似事件?这不是你想要的方式。相反,绑定AutoCompleteBox Populating事件并将MinimumPrefixLength上的AutoCompleteBox设置为3,这样只有当您有3个以上的字符时才会触发Populating。要显示在控件中检索的列表,列表需要绑定到ItemsSource属性,然后需要调用方法PopulateComeplte()

您可以在类似的Question上看到我的答案。

但是,它不是MVVM友好的,因为您需要调用AutoCompleteBox上的方法来触发控件以显示Web服务中的列表。看一下这个article的MVVM友好方法,向下滚动到“Bonus:MVVM友好的异步过滤”部分。