【问题标题】:Architecting Silverlight 3 applications构建 Silverlight 3 应用程序
【发布时间】:2009-08-28 08:07:39
【问题描述】:

我正在笨手笨脚地创建一个 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);
}

但是 a.) 这似乎是一个丑陋的 hack,并且 b.) 条件永远不会错误 - 似乎 Ria Services 或类似的可能存在错误。

【问题讨论】:

    标签: architecture silverlight-3.0


    【解决方案1】:

    鉴于标准 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!
        }
    }
    

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        【解决方案3】:

        您还可能会发现类似 David Eitan Poll 的 Silverlight Activity control 在您调用服务时向您的用户提供反馈很有用。


        (来源:davidpoll.com

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多