1

wp7 アプリに Web サービスを使用していますが、サービスへの非同期呼び出しが値を返すかどうかを判断するのが困難です。私は検証が応答(結果)に依存しています。以下は、Web サービスを呼び出すためのコード スニペットと、UI に加える必要がある適切な変更です。

private void TLP_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    objevnt.indexChanged(1, lpcountry.SelectedIndex, "depart");
    if(objevnt.CName.Count>0)
    lpcity.ItemsSource = objevnt.GetCityDetails();
}
public void indexChanged(int Travel,int index,string journey)
{
    string slCountry = null;
    switch (Travel)
    {
        case 1:
            slCountry = lstCtryDetails.lstCtrylist[index].countryId.ToString();
            //= "depart";
            travelMode = journey;
            break;
        case 2:
                slCountry = lstCtryDetails.lstCtrylist[index].countryId.ToString();
                travelMode = journey;
                break;
        case 3:
                slCountry = lstCtryDetails.lstCtrylist[index].countryId.ToString();
                travelMode = journey;
                break;
    }

    GetCities = "http://Solutions/mobileservice/Citylist/countrycode/" + slCountry;
    WebClient myClientcity = new WebClient();
    myClientcity.DownloadStringAsync(new Uri(GetCities, UriKind.RelativeOrAbsolute));
    myClientcity.DownloadStringCompleted += new DownloadStringCompletedEventHandler(myClientcity_DownloadStringCompleted);
}

private void myClientcity_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    string _Countries = null;
    if (e.Error == null)
    {
        _Countries = e.Result;
        parseCtry(_Countries);
    }
}

private void parseCtry(string xml)
{
    XDocument myXdoc = XDocument.Load(new StringReader(xml));
    IEnumerable<XElement> lstElm = myXdoc.Descendants("GetCityList");
    lstCtryDetails.lstCitylist.Clear();
    foreach (XElement ele in lstElm.Elements())
    {
        if (ele.Name.ToString() != "Message")
        {
            // Fetch t Details
            if (!ele.IsEmpty && ele.Name.ToString() == "City")
            {
                lstCtryDetails.lstCitylist.Add(new cityList() { CityId = ele.Element("CityCode").Value, CityName = ele.Element("CityName").Value, CityLatitude = ele.Element("Latitude").Value, CityLongitude = ele.Element("Longitude").Value });
                CName.Add(ele.Element("CityName").Value);
                //Countchk = true;
            }
        }
    }

    lsCity = lstCtryDetails.lstCitylist;

    //chkloop = true;
}

public List<cityList> GetCityDetails()
{
    if (lsCity.Count > 0)
        return lsCity;
    return null;
}

ここで、getcitydetails() メソッドから値のリストを取得する必要があります。しかし、それは非同期呼び出しのために null を返しています。リストの数を取得する方法、適切な検証を行う方法。前もって感謝します。

4

2 に答える 2

0

ItemsSource結果が返される前に、潜在的に設定してWebClientいるだけでなく、を呼び出す機会もありませんでしたparseCtry

移動する場合:

lpcity.ItemsSource = objevnt.GetCityDetails();

最後までparseCtry(つまり、コメントがある場所)、正しいカウントがあると評価されます-ただし、クロススレッドUIアクセスの問題が発生する可能性がありますが、(の開始時に)次//chkloop = true;のようなもので確認できるはずです。DownloadStringCompleted

if (Dispatcher.CheckAccess())
    Dispatcher.BeginInvoke(new DownloadStringCompletedEventHandler(myClientcity_DownloadStringCompleted), xml) // put us back on the UI thread if required

lsCityタイプをに変更しObservableCollection<cityList>てバインドする方がよい場合があります。

于 2012-05-28T15:27:04.713 に答える
0

webrequest を実行する前にコールバックを追加しようとしましたか?

myClientcity.DownloadStringCompleted += new DownloadStringCompletedEventHandler(myClientcity_DownloadStringCompleted);
myClientcity.DownloadStringAsync(new Uri(GetCities, UriKind.RelativeOrAbsolute));

=== 更新 ===

あなたのコメントから、私はその問題を理解していると思います。必要なのは、UI要素にデータをバインドすることです。たとえば、データが にバインドされている(実装している) 場合、が非同期 Web 要求を介して更新されると、UI 要素は自動的に更新されます。ObservableCollection<T>lpCitylpCitylsCityObservableCollection<T>lpCity

Windows PC から離れているので、コード スケルトンを書きます。

于 2012-05-28T11:35:44.560 に答える