0

Windows Phone 用のアプリケーションを作成しています。Windows Phone アプリからの要求の後にサーバーから送信された応答を格納する変数の結果があります。

リクエストを生成してレスポンスを受け取るrequestというクラスがあります。結果変数が変更されたときに、アプリケーションでさらに処理を実行できることを確認したいと考えています。

リクエストクラスは次のとおりです。

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 コードが実行されないのはなぜですか?

4

1 に答える 1

0

PropertyChanged is not magic.
It will only fire if you explicitly raise the event.

You do raise the event in your Result setter, but you aren't calling that.
When you write result = httpWebStreamReader.ReadToEnd();, you set the field directly, without running the property setter.
Thus, the event never fires.

于 2013-04-17T16:00:30.930 に答える