我在创建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或类似的可能存在错误。
答案 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之类的内容对您在致电服务时向用户提供反馈非常有用。
(来源:davidpoll.com)