Async Restsharp将数据转换为datacontext

时间:2014-01-27 08:13:48

标签: c# windows-phone-7 json.net restsharp

public class BerichtenOphalen
{
    public List<Bericht> berichten = new List<Bericht>();

    public List<Bericht> getBerichten(string email)
    {
        var client = new RestClient("http://localhost:8080/ewm/resources");
        client.Authenticator = new HttpBasicAuthenticator("lode_vl@hotmail.com",     "123456");
        var request = new RestRequest("berichten/ontvanger/{id}", Method.GET);
        request.AddUrlSegment("id", email);
        List<Bericht> berichten = new List<Bericht>();
        client.ExecuteAsync(request, response =>
        {
            if (response != null)
            {
                System.Diagnostics.Debug.WriteLine("not null" + response.Content.ToString());
                this.berichten = JsonConvert.DeserializeObject<List<Bericht>>(response.Content);
                System.Diagnostics.Debug.WriteLine("\n\n" +berichten.Count);
            }   
        });
        return berichten;
    }

这个类有效,但是我无法弄清楚如何返回填充了对象的List。

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    BerichtenOphalen req = new BerichtenOphalen();
    this.DataContext = req.getBerichten("lode_vl@hotmail.com");
    base.OnNavigatedTo(e);
} 

这是我尝试将我的列表用作我的应用程序的datacontext的地方,其中从未有任何数据。

2 个答案:

答案 0 :(得分:2)

您的代码目前已损坏 - 您有两个名为berichten的变量,其中一个是方法中的本地变量,其中一个是实例类中的变量。

您将返回局部变量的值,但是您异步填充实例变量引用的列表。这意味着即使异步操作已执行,您的返回值也将始终引用空列表。

如果你修复了这个bug,那么当方法返回时,列表仍然将为空(因为数据尚未被提取)并且List<T>中没有任何内容在更新集合时帮助UI注意。您可以使用ObservableCollection<>,但是您需要确保只更改了UI线程上的集合。

如果您能够使用C#5,我会诚实地调查async / await - 这会强制您的方法返回Task<List<string>>,但它会指示异步更清楚。您的调用方法将类似于:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    BerichtenOphalen req = new BerichtenOphalen();
    DataContext = await req.GetBerichtenAsync("lode_vl@hotmail.com");
    base.OnNavigatedTo(e);
}

您可能需要考虑在其余代码之前移动Base.OnNavigatedTo(e)方法 - 或者完全删除它。基本上,您需要考虑原始行为是什么,以及您是希望立即发生,还是仅在您获取数据之后。

答案 1 :(得分:1)

您应该考虑将MVVM应用于您的项目。 让您的班级BerichtenOphalen成为ViewModel。具有OnNavigatedTo的页面是视图,它应该在xaml中绑定到BerichtenOphalen的类型为ObservableCollection<Bericht>的公共属性。将public List<Bericht> getBerichten(string email)切换为public void LoadBerichten(string email)。从OnNavigatedTo调用的此方法将在UI线程上异步填充Bericht-ObservableCollection。它不会返回任何内容,但会在显示某些内容时通知View。

当你切换到MVVM思考提取和呈现数据的方式时,你会为自己省去很多问题。

对View Code的最简单修改是将DataContext设置为不是方法的返回值,而是设置为BerichtenOphalen的属性,并如上所述在LoadBerichten中更新此属性。