到达另一个类的方法提供的结果

时间:2013-03-04 22:59:37

标签: c# windows-phone-8

我正在制作一个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的结果?提前谢谢。

1 个答案:

答案 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

然后,您将能够在视图模型中处理这些数据。 此致