![](/img/trans.png)
[英]Using MVVM Light, ViewModelLocator hold all ViewModels?
[英]How to handle multiple ViewModels with MVVM Light ViewModelLocator
使用MVVMLight ViewModelLocator时,如何在应用程序中注册和注销多个ViewModel?
问题是我希望能够告诉应用程序哪个ViewModel应该被注册以及哪个未注册。 我的应用程序中有14个ViewModel(其中很少有像SessionViewModel这样在后台运行的视图,它确定所有视图的当前会话状态)
编辑
我的ViewModelLocator的一部分:
public New()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<AdministratorViewModel>();
SimpleIoc.Default.Register<CallViewModel>();
SimpleIoc.Default.Register<EmployeeViewModel>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<MessengerViewModel>();
SimpleIoc.Default.Register<QualityViewModel>();
}
为了能够从XAML中的视图访问ViewModel,我使用了:
DataContext="{Binding Source={StaticResource Locator}}"
LoginViewModel应该适用于所有视图。 并举例说明: Employee View
将仅使用CallViewModel
, EmployeeViewModel
和MessengerViewModel
,因此我不需要Employee View
AdministratorViewModel
和QualityViewModel
。 然后,如何为员工视图注册仅所需的ViewModel?
我认为您需要花一些时间来明确计划此应用程序的目标。
这些寄存器函数在您的viewmodel定位器构建/应用加载期间被调用。 在您创建资源之前,它们不会消耗资源-当您的视图绑定到视图模型时会发生这种情况。 因此,其他尚未“打开”的视图模型尚不存在。
如果“关闭”视图/窗口/用户控件,则视图模型仍然存在。 这可能是有好处的,因为它允许您保留VM的“状态”,以便在再次打开视图时保留数据等。 您将必须找出一种刷新所有记录集的方法。
您可以对视图模型使用unregister函数,它将从缓存中删除:
SimpleIoc.Default.Unregister(AdministratorViewModel);
但是,如果这样做,则必须先注册它才能再次使用。 那么,为什么要这样做,是否要清除内存? 大多数VM都是单例的,在应用程序的整个生命周期中都存在它们是正常的。
您关于LoginViewModle应该可用于所有视图的声明引发了警报。 视图模型本应包含在“工作单元”中,并且VM不应真正与其他VM进行通信(但是有一些例外-因此mvvmLight中的Messenger功能)。 您是否考虑过使用服务来保存每个视图模型都需要可用的功能/业务逻辑。 SImpleIOC的依赖项注入旨在实现此目的。 我有一个UserService可以登录用户并跟踪用户的设置和权限。 然后将此服务注入需要它的每个VM的构造函数中。 例如 :
public interface IUserService
{
employee LoggedEmployee { get; set; }
List<int> UserRoles { get; set; }
bool LoggedIn { get; set; }
void UpdatePassword(int idEmployee, string password);
...
}
Public Class UserService : IUserService
{
Public void UpdatePassword(int idEmployee, String password) { }
}
定义一个服务然后实现它(允许进行测试),然后可以将其注入WM构造函数中:
Public Class AdministratorViewModel
{
Private IUserService _UserService;
Public New(IUserService UserService)
{
Try {
_UserService = UserService;
} catch (Exception ex) {
}
}
}
并且由于此用户服务是单例,因此注入的所有视图模型都可以访问其功能和数据,这使您的应用程序无需担心。
希望这可以帮助您确保朝正确的方向前进
JK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.