2013-04-17 3 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();, вы задаете поле напрямую, не запуская setter.
Таким образом, событие никогда не срабатывает.

+0

Итак, как я могу переписать строку? Извините, но я очень новичок в этих концепциях. –

+0

Я пробовал использовать Result.set, но это дает мне ошибку. –

+0

Хорошо, я решил эту часть. Я просто использовал Result = httpWebStreamReader.ReadToEnd() –

Смежные вопросы