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的地方,其中从未有任何数据。
答案 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中更新此属性。