0
我在我的应用程序中使用mvvm设计模式。在按钮从视图中单击时,它会在我的视图模型中为一个方法提供午餐,并从视图模型中提取另一种模型中的方法,以通过Web请求获取网址中的内容。由于Web请求是异步方法,因此我实现了Observer设计模式以将请求的响应从数据服务推送到我的视图模型。windows phone 8异步web请求与mvvm
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,但我真的不知道如何更新视图... 我会很感激,如果有人知道如何要做到这一点:)
您的视图模型不应该有一个方法(理想情况下)。模型只是存储和运输数据。使用'async'' await'并将数据存入'Task'中。当它有你的数据时,'Task'将返回。 –
@SamLeach我试过你的解决方案,似乎很好,但我有一个错误“request =(HttpWebRequest)HttpWebRequest.Create(uri);”错误说“不能等待IAsyncResult” – tufekoi