Как перейти после завершения вызова асинхронного веб-метода? - PullRequest
2 голосов
/ 30 апреля 2011

Я работаю над приложением Windows Phone, используя веб-сервис.

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

Вот часть моего кода бихинга:

private void Button1Button_Click(object sender, RoutedEventArgs e)
    {
        this._ws.InitializeConnexion("my name");
        this.NavigationService.Navigate(new Uri("/View/profile.xaml", UriKind.Relative));
    }

А вот мой взгляд на модель класса:

public sealed class MobileViewModel : INotifyPropertyChanged
{
   private WSClient _ws;
   private T_member _member;
   public T_member Member
   {
       get
       {
           return _member;
       }
       set
       {
           _member = value;
           this.RaisePropertyChanged("Member");
       }
   }
   public MobileViewModel()
   {
        _ws = new WSMobileClient();
        _ws.InitializeConnexionCompleted += new EventHandler<InitializeConnexionCompletedEventArgs>(_ws_InitializeConnexionCompleted);
   }
   public event PropertyChangedEventHandler PropertyChanged;
   private void RaisePropertyChanged(string propertyName)
   {
        PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
   }
   public void InitializeConnexion(string name)
   {
       _ws.InitializeConnexionAsync(name);
   }
   private void _ws_InitializeConnexionCompleted(object sender, InitializeConnexionCompletedEventArgs e)
   {
       if (e.Error == null)
       {
           this.Member = e.Result;
       }
       else
       {
           MessageBox.Show("error.");
       }
   }
}

Кто-нибудь может мне помочь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Я бы передал лямбду-продолжение методу, запускающему вызов веб-метода - продолжение будет выполнено после успешного завершения вызова:

private void Button1Button_Click(object sender, RoutedEventArgs e)
{
   InitializeConnexion("my name", () => 
   {
       this.NavigationService.Navigate(new Uri("/View/profile.xaml", UriKind.Relative));
   });
}

Вы можете сохранить это как Action в MobileViewModel классе.

   Action _webCallCompletedAction;
   public void InitializeConnexion(string name, Action action)
   {
       webCallCompletedAction = action;
       _ws.InitializeConnexionAsync(name);
   }

и, наконец, выполните его после того, как все ваши веб-службы будут завершены:

private void _ws_InitializeConnexionCompleted(object sender, 
                                              InitializeConnexionCompletedEventArgs e)
   {
       if (e.Error != null)
       {
           this.Member = e.Result;
           webCallCompletedAction(); 
       }
       else
       {
           MessageBox.Show("error.");
       }
   }
}
0 голосов
/ 30 апреля 2011

Вы, конечно, можете сделать это.Пара предложений:

1) Используйте ICommand и привяжите ее к своей кнопке, а не к коду.Это помещает эту логику в вашу модель представления, где она принадлежит. Вот один пример того, как это сделать . И еще .

2) Если у вас есть эта логика в вашей модели представления, вы можете управлять навигацией со статусом вашего соединения, не передавая сообщения обратно в представление.Что-то вроде:

 private void _ws_InitializeConnexionCompleted(object sender, InitializeConnexionCompletedEventArgs e)
 {
        if (e.Error != null)
        {
            this.Member = e.Result;
            this.Navigate("/View/profile.xaml");
        }
        else
        {
            MessageBox.Show("error.");
        }
    }
}

protected void Navigate(string address)
{
    if (string.IsNullOrEmpty(address))
          return;

    Uri uri = new Uri(address, UriKind.Relative);
    Debug.Assert(App.Current.RootVisual is PhoneApplicationFrame);
    ((PhoneApplicationFrame)App.Current.RootVisual).Navigate(uri);            
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...