2013-04-17 136 views
0

我写的Windows Phone的应用程序。我有一个变量结果,它存储了来自Windows Phone应用程序的请求之后服务器发送的响应。OnPropertyChanged事件处理程序

我有一个叫做请求的类,它生成请求并接收响应。我要检查时,该结果变量的变化,我可以在我的应用程序做一些进一步的处理。

这里是请求类:

namespace PhoneApp1 
{ 
    public class Request: INotifyPropertyChanged 
    { 
     public string data; 
     public string result = "test"; 

     public Request() 
     { 

     } 

     public string Result 
     { 
      get 
      { 
       return result; 
      } 
      set 
      { 
       if (this.result == value) 
       { 
        return; 
       } 
       this.result = value; 
       OnPropertyChanged("Result"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public void doRequest(string parameters, string URL) 
     { 
      data = parameters; 

      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request); 
     } 

     public void GetRequestStreamCallback(IAsyncResult callbackResult) 
     { 
      HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
      Stream postStream = myRequest.EndGetRequestStream(callbackResult); 
      byte[] byteArray = Encoding.UTF8.GetBytes(data); 

      postStream.Write(byteArray, 0, byteArray.Length); 
      postStream.Close(); 

      myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest); 
     } 

     public void GetResponsetStreamCallback(IAsyncResult callbackResult) 
     { 
      HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; 
      HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); 

      StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()); 
      result = httpWebStreamReader.ReadToEnd(); 
     } 
    } 
} 

正如你所看到的,我实现了对结果变量的OnPropertyChanged事件处理程序。

下面是我在哪里创建类的实例的要求去做的代码:

    **//Log-in Button Event Handler** 
        Request req = new Request(); 
        req.PropertyChanged += new PropertyChangedEventHandler(req_PropertyChanged); 
        req.doRequest("function=LogIn&username=" + username + "&password=" + password, "http://localhost:4000/Handler.ashx"); 
       } 
      } 
     }**//End of Log-in Button Event Handler** 

     public void req_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      string result = ((Request)sender).Result; 

      if (result.Equals("True") || result.Equals("true")) 
      { 
       PhoneApplicationService.Current.State["Username"] = username; 
       NavigationService.Navigate(new Uri("/Authenticated.xaml", UriKind.Relative)); 
      } 

      else 
      { 
       MessageBox.Show("The log-in details are invalid!"); 
      } 
     } 

出于某种原因或其他,当我点击登录按钮,没有任何反应。没有消息框,没有重定向,甚至没有例外。我无法弄清楚我做错了什么。请帮帮我。我浪费了这两个小时试图解决这个问题。

为什么req_PropertyChanged代码不执行,即使我知道结果变量变化?

回答

0

PropertyChanged不是魔术。
只有在明确提出事件时才会触发。

你做你的Result二传手引发事件,但你是不是调用一个。
当你写result = httpWebStreamReader.ReadToEnd();,您可以直接设置字段,而不运行的属性设置。
因此,事件永远不会发生。

+0

所以,我怎么能改写行?对不起,但我对这些概念很陌生。 –

+0

我尝试使用Result.set,但它给我一个错误。 –

+0

好的,我解决了这个问题。我刚刚使用了Result = httpWebStreamReader.ReadToEnd() –