C# OnPropertyChanged事件处理程序

C# OnPropertyChanged事件处理程序,c#,events,httpwebrequest,httpwebresponse,C#,Events,Httpwebrequest,Httpwebresponse,我正在为Windows Phone编写一个应用程序。我有一个可变结果,用于存储服务器在Windows Phone应用程序发出请求后发送的响应 我有一个名为request的类,它生成请求并接收响应。我想检查结果变量何时更改为,以便对我的应用程序进行进一步处理 以下是请求类: namespace PhoneApp1 { public class Request: INotifyPropertyChanged { public string data;

我正在为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\u PropertyChanged代码没有执行?

PropertyChanged
不是魔术。
只有在明确引发事件时,它才会激发

您确实在
结果设置程序中引发了该事件,但您没有调用它。
当您编写
result=httpWebStreamReader.ReadToEnd()时,您可以直接设置字段,而无需运行属性设置程序。

因此,事件永远不会触发。

那么如何重写该行?对不起,我对这些概念很陌生。好的,我解决了那个部分。我刚刚准确地使用了Result=httpWebStreamReader.ReadToEnd()。您需要设置属性。