2011-04-30 54 views
2

我正在使用web服務在windows phone應用程序上工作。如何在調用異步Web方法完成後導航?

我想在完成webmethod調用後導航到其他頁面。 我不知道它是如何可能的。

這裏是我的看法behing代碼的一部分:

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

有誰可以幫我嗎?

謝謝。

回答

0

你當然可以做到這一點。幾點建議:

1)使用ICommand並將其綁定到您的按鈕而不是後面的代碼。這將該邏輯放置在它所屬的視圖模型中。 Here's one example of how to do thatAnd another

2)一旦你的viewmodel有了這樣的邏輯,你就可以用連接狀態編排導航而不需要將消息傳遞迴視圖。喜歡的東西:

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);    
} 
+0

的ICommand的看起來挺有意思的。但是,我沒有從我的ViewModel NavigationService的可見性。 – fliim 2011-04-30 17:32:22

+0

對。忘了那件事。請參閱編輯。 – dkackman 2011-04-30 17:45:01

+0

感謝您的額外代碼。我嘗試過,但我得到了一個App.Current.RootVisual null。怎麼可能? – fliim 2011-04-30 19:32:02

1

我想傳遞一個延續拉姆達到被觸發的web方法調用的方法 - 當調用已成功完成,然後執行的延續:

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

謝謝你的回答。這是從ViewModel導航的另一種方式。通過您的解決方案,我們可以將Uri從View代碼背後,它可能會更好。 – fliim 2011-05-01 02:02:22

相關問題