我正在试图弄清楚如何将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次请求。
答案 0 :(得分:1)
我假设您正在使用KeyDown
事件或类似事件?这不是你想要的方式。相反,绑定AutoCompleteBox
Populating
事件并将MinimumPrefixLength
上的AutoCompleteBox
设置为3,这样只有当您有3个以上的字符时才会触发Populating
。要显示在控件中检索的列表,列表需要绑定到ItemsSource
属性,然后需要调用方法PopulateComeplte()
。
您可以在类似的Question上看到我的答案。
但是,它不是MVVM友好的,因为您需要调用AutoCompleteBox
上的方法来触发控件以显示Web服务中的列表。看一下这个article的MVVM友好方法,向下滚动到“Bonus:MVVM友好的异步过滤”部分。