0

RSSリーダーを作成していますが、MVVMとクラス間の通信を維持するのに問題があります。

私はViewModelを持っていますが、ビューにバインドしたいアイテムのリストがあり、それをアイテムと呼びます。

別のクラス、アイテムリストのアイテムを提供するFeedReaderがあります。少なくともそれが私の目標です。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では、フィードリーダーのGetFeed(Uri)をURIで呼び出します。提供されたアイテムをアイテムリストに入力したいと思います。問題は、アイテムを提供するメソッドがUpdateFeedであり、それを呼び出さなかったため、GetFeedを呼び出したことです。

        var feed = new FeedReader();
        feed.GetFeed(uri);

ViewModelでUpdateFeedの結果に到達するにはどうすればよいですか?前もって感謝します。

4

1 に答える 1

1

taskcompletionsource を使用して awaitable にする必要があります。

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 に答える