我正在进行一个小概念验证应用程序.这主要是为了增强Silverlight中的MVVM技能.我今天遇到了一个有趣的问题,我无法想出如何解决MVVM方式.我也没有成功地在搜索过程中发现任何相关内容.
所以在这个问题上,我有一个带有数据库后端的简单业务类型应用程序.我有一个登录视图和一个附加的视图模型,它将执行登录并报告成功或失败.没问题.我还没有满意的是向用户报告等待屏幕的方法.因此,在我的登录屏幕上,用户单击"登录",数据库聊天完成后会有几秒钟的延迟.我想报告此情况并禁用任何互动,直到呼叫完成.
我有几个想法.首先,将Cursor属性绑定到viewmodel,VM可以将IsBusy属性设置为true.问题是我似乎无法绑定到UserControl的Cursor(Visual Studio说AG_E_RUNTIME_MANAGED_UNKNOWN_ERROR).
第二个想法是有一个等待屏幕.你知道,小齿轮转动或你想要的任何动画.这很好,但我不清楚如何通过Xaml让视图通过模型切换.我知道我绝对可以挂钩事件并在代码中处理它.也许这是要走的路?似乎只是反对MVVM粒度.
会对如何处理这个问题的更多想法感兴趣.
谢谢.
我们最终使用了一个服务来处理长时间运行的请求。该服务将工作负载作为委托,然后将其传递给BackgroundWorker,同时还打开我们的“请稍候”视图。
这很有效,因为它允许我们使用相当简单的界面以相同的方式控制所有 ViewModel 中长时间运行的进程。
当您需要延迟时,您可以让来自 ViewModel 的事件更新视图,但是您需要在所有 ViewModel 中包含此代码,而不是在可以更轻松维护的单个类中。
编辑服务只是在 IOC 容器中注册的类,并且可以由 ViewModel 使用。
public interface IProcessingService
{
void Process(Action<BackgroundWorker> action);
void Process(Action<BackgroundWorker> action,
Action<RunWorkerCompletedEventArgs> finish);
}
Run Code Online (Sandbox Code Playgroud)
使用它你的 ViewModel 可以实现类似的东西。
{
var processingService = container.Resolve<IProcessingService>();
processingService.Process(worker =>
{
worker.ReportProgress(0, "Please wait...");
// Do work here
worker.ReportProgress(50);
// Do more work
worker.ReportProgress(100);
});
}
Run Code Online (Sandbox Code Playgroud)
这样,用于显示进度通知的所有代码都位于实现的类中IProcessingService,并且您的视图中没有任何直接控制视图或任何 UI 元素的代码。
| 归档时间: |
|
| 查看次数: |
4290 次 |
| 最近记录: |