我正在制作一个RSS阅读器,我在保持MVVM和类之间的通信方面遇到了麻烦。
我有一个ViewModel,有一个项目列表,我想绑定到View,称之为项目。
还有另一个类,一个FeedReader,它将为Items列表提供项目。至少这是我的目标。 FeedReader具有以下方法:
public void GetFeed(Uri uri)
{
// that's all it does:
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(uri);
}
private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
// the async method finished
// calls UpdateFeed:
UpdateFeed(e.Result);
}
private List<ItemViewModel> UpdateFeed(string feedXML)
{
// parsing the string
// LINQ to XML query does the rest, creates new Model items, put them in a list with .ToList()
//return this result List:
return feedItems;
}
这些方法运行正常。
在ViewModel中,我用uri调用FeedReader的GetFeed(Uri)。我想用提供的项目填充项目列表。问题是提供项目的方法是UpdateFeed而我没有调用它,我称之为GetFeed。
var feed = new FeedReader();
feed.GetFeed(uri);
如何在ViewModel中获得UpdateFeed的结果?提前谢谢。
答案 0 :(得分:1)
您应该使用taskcompletionsource使其等待;
public Task<List<Foo>> GetFeed(Uri uri)
{
var tcs = new TaskCompletionSource<List<Foo>>(); //used to transform a synchronous method into an asynchronous.
WebClient webClient = new WebClient();
webClient.DownloadStringAsync(uri);
webClient.DownloadStringCompleted += async(sender,e)=>
{
tcs.SetResult(e.Result); //Method ended, can now return.
};
return tcs.Task;
}
在您的视图模型中:
var feed = new FeedReader();
var listFoo = feed.GetFeed(uri);
//UpdateFeed
然后,您将能够在视图模型中处理这些数据。 此致