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!");
            }
        }

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

为什么 req_PropertyChanged 代码没有执行,即使我知道结果变量正在改变?

4

1 回答 1

0

PropertyChanged不是魔法。
它只会在您明确引发事件时触发。

你确实在你的Resultsetter 中引发了事件,但你没有调用它。
编写result = httpWebStreamReader.ReadToEnd();时,直接设置字段,无需运行属性设置器。
因此,该事件永远不会触发。

于 2013-04-17T16:00:30.930 回答