1

我正在开发一个应用程序,并且正在重组我的代码。

在我的 MainPage.xaml.cs 上有一个 TextBlock 和一个 ListBox。我有单独的文件(Info.cs)来处理 HttpRequest 以获取我需要加载的信息。

Info.cs 中的 HttpRequest 从天气 API 获取信息。当它获得所有信息时,它会将信息放入 ObservableCollection 中。这个 ObservableCollection 绑定到 ListBox。

现在,我想在 HttpRequest 完成后更新 TextBlock,以向用户显示所有信息都已加载。

我怎样才能做到这一点?

MainPage.xaml.cs:

        WeatherInfo weatherInfo = new WeatherInfo();
        weatherInfo.getTheWeatherData();

        DataContext = weatherInfo;
        WeatherListBox.ItemsSource = weatherInfo.ForecastList;

        StatusTextBlock.Text = "Done.";

在 Info.cs 中,我有一个 Dispatcher 来填充 ForecastList:

    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        ForecastList.Clear();
        ForecastList = outputList;    
    }

现在发生的事情是 TextBlock 立即更改为“完成!” (doh,它的异步!)但是我该如何改变呢?所以它在 ListBox 上“等待”更新?不幸的是,Windows Phone 中没有“ItemsSourceChanged”事件。

4

1 回答 1

1

我建议使用 C# 5.0 中的新async+await功能,这实际上是在 WP8中使用异步编程的好习惯。

假设您可以控制getTheWeatherData()方法,并且可以将其标记为async返回的方法,Task则可以使用await修饰符调用它。

await不会阻塞 UI,只会在任务完成后才执行下一行代码。

    WeatherInfo weatherInfo = new WeatherInfo();
    await weatherInfo.getTheWeatherData();

    DataContext = weatherInfo;
    WeatherListBox.ItemsSource = weatherInfo.ForecastList;

    StatusTextBlock.Text = "Done.";

编辑:通过Nuget PackageWP 8和 on 支持它WP 7.5Microsoft.Bcl.Async

如果异步编程不是一个选项,您总是可以eventWeatherInfo类中创建一个回调,该回调将在内部发出信号getTheWeatherData(),并在 UI 上注册到它。

一个选项如下所示:

public static void DoWork(Action processAction)
{
  // do work
  if (processAction != null)
    processAction();
}

public static void Main()
{
  // using anonymous delegate
  DoWork(delegate() { Console.WriteLine("Completed"); });

  // using Lambda
  DoWork(() => Console.WriteLine("Completed"));
}

两个DoWork()调用都以调用作为参数传递的回调结束。

于 2013-07-06T11:26:48.450 回答