【问题标题】:Don't show dropdown in Autocompletebox in windows phone不在 Windows Phone 的自动完成框中显示下拉菜单
【发布时间】:2013-05-26 09:58:56
【问题描述】:

我从服务器得到响应,它是 Json,其中包含有关街道名称的数据。然后我将响应字符串解析为 Json,并将街道名称添加到列表中。我希望此列表显示为自动完成框中的下拉列表,当文本长度等于两个时(我在自动完成框中按第二个字符)。 我也使用 Json.Net 库。 我使用此代码:

这是我使用的类(JsonWorker):

class JsonWorker
    {

        public async Task<HttpWebResponse> send(string requestUrl, JObject jsonObjesct)
        {
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(requestUrl);
            request.ContentType = "text/plain; charset=utf-8";
            request.Method = "POST";

            byte[] jsonAsBytes = Encoding.UTF8.GetBytes(jsonObjesct.ToString());

            Stream x = await request.GetRequestStreamAsync();
            await x.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
            x.Close();

            HttpWebResponse response = (HttpWebResponse) (await request.GetResponseAsync());
            return response;
        }

        public async Task<string> get(
            HttpWebResponse response)
        {
            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            string str_responsefromjson = await sr.ReadToEndAsync();
            sr.Close();
            stream.Close();

            return str_responsefromjson;

        }

这里是方法(GetSteets):

private async Task<List<string>> GetStreets()
    {
        JObject jo = new JObject();
        jo.Add("chars", AutoCompleteBox_Streets.Text);
        jo.Add("city_id", "1");

        JsonWorker jWorker = new JsonWorker();
        var response = await jWorker.send("website", jo);
        string str_responseformjson = await jWorker.get(response);

        jo = JObject.Parse(str_responseformjson);


        JArray ja = (JArray)jo["street"];


        List<string> list_Streets = new List<string>();


        foreach (var elem in ja)
        {

            list_Streets.Add(elem["title"].ToString());
        }


        return list_Streets;
    }

这是我调用上述方法的时候:

private async void AutoCompleteBox_Streets_TextChanged(object sender, RoutedEventArgs e)
        {
            if (AutoCompleteBox_Streets.Text.Length.Equals(2))
            {
                AutoCompleteBox_Streets.ItemsSource = await GetStreets(); 
                //On the string of code above in debug, ItemSource contains list of streets
            }
        }

当我在自动完成框中输入第二个字符时,它不显示下拉列表。请帮忙。

【问题讨论】:

  • 另外,如果我将 FilterMode 更改为 Contains,当我输入 3 或 4 个字符时,它会开始显示下拉菜单。一些魔法......

标签: windows-phone-7 autocompletebox


【解决方案1】:

编辑

了解您的用例后,您需要使用Populating 事件。当您想用可能的匹配项填充下拉列表时会触发此事件。要在输入 2 个或更多字符后调用它,您还需要将 MinimumPrefixLength 设置为 2。

此外,将您的 GetStreets 方法更改为采用包含文本框中字符的 string 参数。

// Your page Loaded event. Bind this event in your xaml.
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
  AutoCompleteBox_Streets.MinimumPrefixLength = 2;
  AutoCompleteBox_Streets.Populating += AutoComplete_Populating;
}

private async void AutoComplete_Populating(object sender, PopulatingEventArgs e) {
   // e.Parameter will contain the chars in your textbox.
   AutoCompleteBox_Streets.ItemsSource = 
       await GetStreets(HttpUtility.UrlEncode(e.Parameter));
   AutoCompleteBox_Streets.PopulateComplete();
}

private async Task<List<string>> GetStreets(string chars) {
  JObject jo = new JObject();
  jo.Add("chars", chars);
  // Rest of your method code
  // ...
}

您需要将MinimumPrefixLength 属性设置为2。

还将您的绑定移动到构造函数并删除TextChanged 事件。

// Your constructor
public MyPage() {
  InitializeComponent();
  BindStreetNames();
}

private async void BindStreetNames() {
  AutoCompleteBox_Streets.ItemsSource = await GetStreets();
  AutoCompleteBox_Streets.MinimumPrefixLength = 2;
}

private async void AutoCompleteBox_Streets_TextChanged(object sender, RoutedEventArgs e) {
  /* Remove this handler */
}

【讨论】:

  • 输入两个字符后,我需要从服务器获取街道列表。我尝试使用 MinimumPrefixLength,但没有帮助。
  • 不建议在 TextChanged 事件中进行网络请求调用。您需要考虑到远程呼叫可能需要不同的时间,具体取决于网络状况,因此满足您要求的可能性非常小。上面的代码会在输入 2 个字符后弹出列表。
  • 我需要在我的请求中发送两个字符。只有我发送两个字符,我才能得到响应。所以我需要在输入两个字符后调用 GetSteets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多