2009-08-28 2 views
0

Я ухаживаю за созданием приложения Silverlight 3. Мне нужно некоторое руководство на высоком уровне для следующего сценария.Архитектура Silverlight 3 приложения

У меня есть страница, где пользователь заполняет кучу информации. В нижней части страницы есть кнопка отправки.

При щелчке, он передает информацию в базу данных (через службы ria), а затем мне нужно перенаправить пользователя на новую страницу.

Мой Submit метод в основном выглядит так:

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

Поскольку метод SaveMyStuff() является асинхронным, функция Navigate выполняется почти немедленно. И кажется, что фиксация базы данных никогда полностью не завершена. Переход от страницы приводит к выгрузке (и модели просмотра).

Так что, в принципе, я не хочу, чтобы перенаправление выполнялось до тех пор, пока биткация БД не завершилась, поэтому я смотрю на проводку обработчиков событий, и все это превращается в путаницу. Есть ли какой-то образец или передовая практика для обработки того, могут ли страницы перемещаться от (и других основных механизмов страницы)?

Я имел некоторый код, который был в основном:

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

Но а), который, кажется, как уродливые взломать, и б) это условие никогда не ложь - кажется, там может быть ошибка в RIA Services.. или похожие.

ответ

3

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

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

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

С точки зрения объекта RIA Data Services (внутри вашей 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); 
} 
Смежные вопросы