2013-04-17 2 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!"); 
      } 
     } 

어떤 이유로 또는 다른 경우 : 여기

내가 요청을 수행하는 클래스의 인스턴스를 생성하고있는 곳에서 코드입니다. 메시지 상자 없음, 리디렉션 없음, 예외 없음. 내가 뭘 잘못하고 있는지 알 수 없다. 도와주세요. 지난 2 시간 동안이 문제를 해결하기 위해 낭비했습니다.

결과가 변수가 변경된다는 것을 알고 있더라도 req_PropertyChanged 코드가 실행되지 않는 이유는 무엇입니까?

답변

0

PropertyChanged은 마법이 아닙니다.
명시 적으로 이벤트를 발생시키는 경우에만 실행됩니다.

당신은 Result 세터에서 이벤트를 발생시키지 만 사용자는이를 호출하지 않습니다.
result = httpWebStreamReader.ReadToEnd();을 쓸 때 속성 설정기를 실행하지 않고 필드를 직접 설정합니다.
따라서 이벤트가 발생하지 않습니다.

+0

그래서 어떻게 행을 다시 쓸 수 있습니까? 미안하지만 나는이 개념들에 대해 아주 새롭다. –

+0

Result.set을 사용했지만 오류가 발생했습니다. –

+0

나는 그 부분을 해결했다. 방금 Result = httpWebStreamReader.ReadToEnd()를 사용했습니다. –