2009-08-28 3 views
0

Silverlight 3 응용 프로그램을 만드는 중 실수하고 있습니다. 다음 시나리오에 대한 높은 수준의 지침이 필요합니다.Silverlight 3 응용 프로그램 설계

사용자가 많은 정보를 입력하는 페이지가 있습니다. 페이지 하단에는 기본적으로 제출 버튼이 있습니다.

클릭하면 ria 서비스를 통해 데이터베이스에 정보가 커밋되고 사용자에게 새 페이지가 전달되도록 정보가 필요합니다.

제출 내 방법은 기본적으로 그래서 다음과 같습니다

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

SaveMyStuff() 메서드는 비동기이기 때문에

에서, 이동 기능은 거의 immediatly 실행됩니다. 그리고 데이터베이스에 대한 커밋이 완전히 완료되지 않은 것으로 보입니다. 페이지 밖으로 이동하면 뷰 모델과 뷰 모델이 언로드됩니다.

그래서 기본적으로 리디렉션은 DB 커밋이 완료 될 때까지 발생하지 않으므로 이벤트 처리기를 연결하는 것이 중요하며 모든 것이 엉망이되고 있습니다. 페이지가 다른 페이지 기본 페이지에서 빠져 나갈 수 있는지 여부를 처리하기위한 패턴이나 모범 사례가 있습니까? .. - 리아 서비스의 버그가있을 수 있습니다 보인다

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

그러나) 못생긴 해킹 것 같아, 그리고 b)는 그 조건이 결코 거짓 :

는 기본적으로 내가했다 몇 가지 코드를 가지고 있었다 또는 유사합니다.

답변

3

표준 Silverlight 모델이 비동기 적이기 때문에 여기에서 가장 좋은 방법은 SaveMyStuff이 완료되면 호출 할 수 있는지 확인하는 것입니다.이 시점에서 콜백의 다음 페이지로 이동할 수 있습니다. 문제는 당신의 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

는 소리 : 당신이 할 수처럼 RIA 데이터 서비스 개체의 측면에서

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

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

(당신의 ViewModel 내부 아마도)이 보인다. 당신은

ViewModel.SaveMyStuff(); // synchronous call

또는

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

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