首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >架构Silverlight 3应用程序

架构Silverlight 3应用程序
EN

Stack Overflow用户
提问于 2009-08-28 08:07:40
回答 2查看 344关注 0票数 0

我正在笨拙地创建一个Silverlight3应用程序。对于下面的场景,我需要一些高级指导。

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

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

我的Submit方法基本上看起来像这样:

代码语言:javascript
复制
void Click(object o, eventArgs e) {
    ViewModel.SaveMyStuff();
    this.NavigationService.Navigate(MyUri);
}

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

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

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

代码语言:javascript
复制
if (ViewModel.RiaDataContext.IsSubmitting) {
    Thread.Sleep(500);
}

但a.)这看起来像是一个丑陋的黑客行为。这种情况永远不会错--看起来Ria Services或类似服务中可能存在错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-28 08:14:53

考虑到标准的Silverlight模型是异步的,这里最好的方法是确保SaveMyStuff可以在完成后调用您-此时,您可以导航到该回调中的下一个页面。

代码语言:javascript
复制
this.ViewModel.BeginSaveMyStuff(this.OnSaveDone, null);

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

就RIA Data Services对象而言(可能在您的ViewModel中),看起来您可以这样做:

代码语言:javascript
复制
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!
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-08-28 08:17:26

听起来问题出在您的ViewModel类设计上。你应该要么

ViewModel.SaveMyStuff(); // synchronous call

代码语言:javascript
复制
ViewModel.SaveMyStuffCompleted += new SaveMyStuffCompletedEventHandler(ViewModel_SaveMyStuffCompleted);
ViewModel.SaveMyStuffAsync();
...

void ViewModel_SaveMyStuffCompleted(object sender, SaveMyStuffCompletedEventArgs e)
{
    this.NavigationService.Navigate(MyUri);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1345641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档