Обработчик события OnPropertyChanged

Я пишу приложение для Windows Phone. У меня есть переменный результат, в котором хранится ответ, отправленный сервером после запроса из приложения Windows Phone.

У меня есть класс с именем request, который генерирует запрос и получает ответ. Я хочу проверить, когда переменная result изменится на то, что я могу выполнить дальнейшую обработку своего приложения.

Вот класс запроса:

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 не выполняется, хотя я знаю, что переменная result изменяется?


person Joe Borg    schedule 17.04.2013    source источник


Ответы (1)


PropertyChanged — это не волшебство.
Оно сработает только в том случае, если вы явно инициируете событие.

Вы создаете событие в установщике Result, но не вызываете его.
Когда вы пишете result = httpWebStreamReader.ReadToEnd();, вы устанавливаете поле напрямую, без запуска установщика свойств.
Таким образом, событие никогда не срабатывает.

person SLaks    schedule 17.04.2013
comment
Итак, как я могу переписать строку? Извините, но я очень новичок в этих понятиях. - person Joe Borg; 17.04.2013
comment
Хорошо, я решил эту часть. Я просто использовал Result = httpWebStreamReader.ReadToEnd() - person Joe Borg; 17.04.2013
comment
В яблочко. Вам нужно установить свойство. - person SLaks; 18.04.2013