首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有mvvm的windows 8异步web请求

带有mvvm的windows 8异步web请求
EN

Stack Overflow用户
提问于 2013-10-03 07:33:49
回答 1查看 777关注 0票数 0

我在应用程序中使用了mvvm设计模式。在视图中单击一个按钮,它会在我的视图模型中找到一个方法,而从视图模型中的另一个方法,通过web请求从一个web地址获取内容。由于web请求是一个异步方法,所以我实现了一个观察者设计模式,将请求的响应从数据服务推送到我的视图模型。

2个问题:

  1. 是个好主意吗?
  2. 如何将响应从视图模型推送到视图?第二个观察者dp?

谢谢。

编辑:我将代码更改为使用INotifyPropertyChanged,但仍然阻止视图的更新.

我认为:

代码语言:javascript
复制
private void searchButton_Click(object sender, RoutedEventArgs e)
{
    vm = new ResultSearchViewModel();
    vm.Search(stringRequest);

    DataContext = vm.ResponseParse;
}

在我看来,模型:

代码语言:javascript
复制
class ResultSearchViewModel
{
    private string _response
    {
        get { return App.WR.Result; }
    }

    public ContainerResult ResponseParse
    {
        get 
        {
            if (_response != null)
            {
                return JsonConvert.DeserializeObject<ContainerResult>(_response);
            }
            else
            {
                return null;
            }
        }
    }

    public void Search(string searchContent)
    {
        App.WR.Get("http://api.deezer.com/search?q=" + searchContent);
    }
}

App.WR是我的应用程序中的一个服务:

代码语言:javascript
复制
public class WebRequestService : INotifyPropertyChanged
{
    private string result;
    public string Result
    {
        get { return result; }
        set
        {
            result = value;
            NotifyPropertyChanged("Result");
        }
    }

    public string Uri;
    public HttpWebRequest Request;


    public void Get(string _uri)
    {
        Uri = _uri;

        Request = (HttpWebRequest)HttpWebRequest.Create(Uri);
        Request.BeginGetResponse(GetStringFromStream, Request);
    }

    private void GetStringFromStream(IAsyncResult result)
    {
        HttpWebRequest request = result.AsyncState as HttpWebRequest;
        if (request != null)
        {
            try
            {
                WebResponse response = request.EndGetResponse(result);

                try
                {
                    StreamReader streamReader = new StreamReader(response.GetResponseStream(), true);
                    try
                    {
                        Result = streamReader.ReadToEnd();
                    }
                    finally
                    {
                        streamReader.Close();
                    }
                }
                catch (WebException e)
                {
                    Result = e.ToString();
                }
                finally
                {
                    response.Close();
                }
            }
            catch (WebException e)
            {
                Result = e.ToString();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

网络请求工作,我可以看到Json正确的分析,如果我添加Debug.WriteLine,但我真的不知道如何更新视图.如果有人知道怎么做的话,我会非常感激的:)

EN

回答 1

Stack Overflow用户

发布于 2013-10-03 10:22:29

我通常希望看到这样做的方式是:

  • 视图上的按钮绑定到ViewModel中的命令。
  • 命令对注入的服务或直接在请求数据的模型中执行方法。
  • 响应用于填充VM的一个或多个属性。
  • 属性绑定到视图,以便在那里显示更改。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19153397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档