Архитектура приложений Silverlight 3 - PullRequest
0 голосов
/ 28 августа 2009

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

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

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

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

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

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

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

У меня был какой-то код, который был в основном:

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

Но а.) Что кажется уродливым взломом, и б.) Это условие никогда не ложно - кажется, что в Ria Services может быть ошибка или подобное.

Ответы [ 3 ]

3 голосов
/ 28 августа 2009

Учитывая, что стандартная модель 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 голосов
/ 28 августа 2009

Похоже, проблема в дизайне класса ViewModel. Вы должны иметь либо

ViewModel.SaveMyStuff(); // synchronous call

или

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

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