我正在笨拙地创建一个Silverlight3应用程序。对于下面的场景,我需要一些高级指导。
我有一个页面,用户填写了一堆信息。在页面的底部基本上有一个提交按钮。
当点击时,它提交信息到数据库(通过ria服务),然后我需要它将用户转发到一个新页面。
我的Submit方法基本上看起来像这样:
void Click(object o, eventArgs e) {
ViewModel.SaveMyStuff();
this.NavigationService.Navigate(MyUri);
}因为SaveMyStuff()方法是异步的,所以导航函数几乎是立即运行的。看起来,对数据库的提交永远不会完全完成。离开页面会导致页面(和视图模型)被卸载。
因此,基本上我不希望重定向发生,直到数据库提交完成后,所以我正在考虑连接事件处理程序,这一切都变得有点混乱。是否有某种模式或最佳实践来处理页面是否可以被导航离开(以及其他基本的页面机制)?
我确实有一些代码,基本上是:
if (ViewModel.RiaDataContext.IsSubmitting) {
Thread.Sleep(500);
}但a.)这看起来像是一个丑陋的黑客行为。这种情况永远不会错--看起来Ria Services或类似服务中可能存在错误。
发布于 2009-08-28 08:14:53
考虑到标准的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!
}
}发布于 2009-08-28 08:17:26
听起来问题出在您的ViewModel类设计上。你应该要么
ViewModel.SaveMyStuff(); // synchronous call
或
ViewModel.SaveMyStuffCompleted += new SaveMyStuffCompletedEventHandler(ViewModel_SaveMyStuffCompleted);
ViewModel.SaveMyStuffAsync();
...
void ViewModel_SaveMyStuffCompleted(object sender, SaveMyStuffCompletedEventArgs e)
{
this.NavigationService.Navigate(MyUri);
}https://stackoverflow.com/questions/1345641
复制相似问题