我正在使用一个使用WPF,MVVM,Prism和MEF的应用程序。
我正在使用导航与请求导航的组合,使用区域管理器进行视图管理的控制器,以及通过事件聚合器进行事件处理以在单个窗口中运行应用程序。我正在使用类似于Stock Trader RI工作方式的第一种视图方法。 当任何与UI交互的视图模型代码(忙碌指示符)被用户启动时,这很有效,但是当它在幕后启动时可能会出现问题。
我知道这似乎是一个糟糕的实现,但我认为我有一个有效的方案。我的具体例子与登录有关。
目前,应用程序启动并加载shell。登录视图将加载到shell的主要内容区域中。当用户单击“登录”时,将显示忙碌指示符并执行客户端应用程序服务登录。登录完成后,忙碌指示消失,屏幕将导航到用户的主屏幕。
这很有效,因为导航登录和导航是由用户单击登录按钮启动的。
所以现在我有一个新的要求,即用户可以在登录表单上选择自动登录,这样下次用户启动应用程序时,登录视图将不会显示,登录将在幕后进行。
现在如果我只是想调用自动登录功能,没有问题,这本身没有UI交互,并且可以正常工作。但登录需要几秒钟,我想显示我的忙指示符。
问题是我在哪里启动自动登录电话? shell视图模型构造函数? shell视图模型PartImportsSatisfied实现?在任何这些地方,shell视图(包含我的忙指示符)尚未真正加载。因此,我所需的资源,如区域和区域经理都不可用。 那么对我来说这可能是一个好方法:
检查以前的用户是否应该自动登录(弄清楚这部分)
If yes then
Show busy indicator
Attempt to auto login
If auto login was success
Hide busy indicator
Navigate to user home screen
Else
Hide busy indicator
Navigate to login screen
Else
Hide busy indicator
Navigate to the login screen
非常感谢任何想法。
答案 0 :(得分:2)
在ShellViewModel
中实现一个接口,该接口将处理可加载的概念。不要在ShellViewModel
的构造函数中执行此逻辑,因为这通常是不好的做法,应该用于最多实例化对象。
public class ShellViewModel : ILoadable
{
public ShellViewModel()
{
}
bool ILoadable.Load()
{
//this is where you can take care of your auto login
}
}
然后你可以在Bootstrapper
课程中调用它。如果这是在另一个模块中完成的,您可以在IModule.Initialize
方法中调用它。
我还认为这个逻辑应该在一个服务中实现,如上所述可以由ShellViewModel
调用,或者理论上可以直接从Bootstrapper
类调用;允许ShellViewModel可能使用服务中的有状态数据。