0

我正在制作一个 RSS 阅读器,但在保持 MVVM 和类之间的通信方面遇到了麻烦。

我有一个 ViewModel,有一个我想绑定到视图的项目列表,称之为项目。

还有另一个类,一个 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 的结果?提前致谢。

4

1 回答 1

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

然后您将能够在您的视图模型中使用这些数据。问候

于 2013-03-05T07:56:48.043 回答