构建Silverlight 3应用程序

时间:2009-08-28 08:07:40

标签: architecture silverlight-3.0

我在创建Silverlight 3应用程序时遇到了麻烦。我需要一些针对以下场景的高级指导。

我有一个页面,用户填写了大量信息。在页面底部基本上有一个提交按钮。

单击时,它会将信息提交到数据库(通过ria服务),然后我需要它将用户转发到新页面。

我的提交方法基本上如此:

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

因为SaveMyStuff()方法是异步的,所以Navigate函数几乎立即运行。看来,对数据库的提交永远不会完全完成。导航离开页面会导致它(和视图模型)被卸载。

所以基本上我不希望重定向发生,直到数据库提交完成之后,所以我正在寻找连接事件处理程序,这一切都变得有点混乱。是否有某种模式或最佳实践来处理是否可以导航页面(以及其他基本页面机制)?

我确实有一些代码基本上是:

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

但是a。)看起来像一个丑陋的黑客,而且b。)条件永远不会是假的 - 似乎Ria Services或类似的可能存在错误。

3 个答案:

答案 0 :(得分: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!
    }
}

答案 1 :(得分: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);
}

答案 2 :(得分:0)

您可能还会发现David Eitan Poll Silverlight Activity control之类的内容对您在致电服务时向用户提供反馈非常有用。

Silverlight Activity control
(来源:davidpoll.com