2009-08-28 70 views
0

我正在通過創建Silverlight 3應用程序的方式拙劣。我需要一些關於以下場景的高級指導。構建Silverlight 3應用程序

我有一個頁面,用戶填寫了一堆信息。在頁面的底部,基本上有一個提交按鈕。

點擊後,它會將信息提交給數據庫(通過ria服務),然後我需要它將用戶轉發到新頁面。

我提交方法基本上看起來像這樣:

void Click(object o, eventArgs e) { 
    ViewModel.SaveMyStuff(); 
    this.NavigationService.Navigate(MyUri); 
} 

因爲SaveMyStuff()方法是異步的,在導航功能運行幾乎立刻。看來,對數據庫的提交從未完全完成。離開頁面導致它(和視圖模型)被卸載。

所以基本上我不希望重定向發生,直到數據庫提交完成後,所以我正在尋找連接事件處理程序,這一切都變成了一個混亂。是否有某種模式或最佳做法來處理頁面是否可以遠離(和其他基本頁面機制)?

我確實有一些代碼,基本上是:

if (ViewModel.RiaDataContext.IsSubmitting) { 
    Thread.Sleep(500); 
} 

但是)這似乎是一個醜陋的黑客攻擊,以及b)條件從來都不是假的 - 似乎有可能是在RIA服務中的錯誤。或類似的。

回答

3

鑑於標準Silverlight模型是異步的,這裏最好的方法是確保SaveMyStuff在完成後可以調用您 - 此時您可以導航到該回調中的下一頁。

this.ViewModel.BeginSaveMyStuff(this.OnSaveDone, null); 

private void OnSaveDone(IAsyncResult ar) 
{ 
    Dispatcher.BeginInvoke(() => this.NavigateToNextPage()); 
} 

在RIA數據服務對象的條件(你的ViewModel裏面大概),它看起來像你可以這樣做:

myContext.SubmitChanges(OnSubmitCompleted, null); 

private void OnSubmitCompleted(SubmitOperation so) 
{ 
    if (so.Error != null) 
    { 
     // Show the error somehow 
    } 
    else 
    { 
     // Fire an event, trigger navigation, you decide! 
    } 
} 
2

聽起來就像是問題是你的ViewModel類的設計。您應該有

ViewModel.SaveMyStuff(); // synchronous call

ViewModel.SaveMyStuffCompleted += new SaveMyStuffCompletedEventHandler(ViewModel_SaveMyStuffCompleted); 
ViewModel.SaveMyStuffAsync(); 
... 

void ViewModel_SaveMyStuffCompleted(object sender, SaveMyStuffCompletedEventArgs e) 
{ 
    this.NavigationService.Navigate(MyUri); 
}