2013-10-03 110 views
0

我在我的应用程序中使用mvvm设计模式。在按钮从视图中单击时,它会在我的视图模型中为一个方法提供午餐,并从视图模型中提取另一种模型中的方法,以通过Web请求获取网址中的内容。由于Web请求是异步方法,因此我实现了Observer设计模式以将请求的响应从数据服务推送到我的视图模型。windows phone 8异步web请求与mvvm

2个问题:

  1. 这是个好主意吗?
  2. 如何将我的viewmodel的响应推送到视图?第二个Observer dp?

谢谢。

编辑: 更改我的代码以使用INotifyPropertyChanged的,但我还是堵住视图的更新中...

在我看来

private void searchButton_Click(object sender, RoutedEventArgs e) 
{ 
    vm = new ResultSearchViewModel(); 
    vm.Search(stringRequest); 

    DataContext = vm.ResponseParse; 
} 
在我的视图模型

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是服务我在我的应用程序:

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)); 
     } 
    } 
} 

web请求的工作,我可以看到JSON的正确解析,如果我添加索姆的Debug.WriteLine,但我真的不知道如何更新视图... 我会很感激,如果有人知道如何要做到这一点:)

+0

您的视图模型不应该有一个方法(理想情况下)。模型只是存储和运输数据。使用'async'' await'并将数据存入'Task'中。当它有你的数据时,'Task'将返回。 –

+0

@SamLeach我试过你的解决方案,似乎很好,但我有一个错误“request =(HttpWebRequest)HttpWebRequest.Create(uri);”错误说“不能等待IAsyncResult” – tufekoi

回答

0

的方式我通常会看到这样做将是:上视

  • 按钮被绑定到视图模型的命令。
  • 命令在注入的服务上执行方法,或直接在请求数据的模型中执行方法。
  • 响应用于填充虚拟机的一个或多个属性。
  • 该属性绑定到视图,以便在其中显示更改。