繁体   English   中英

如何使用MVVM Light ViewModelLocator处理多个ViewModel

[英]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将仅使用CallViewModelEmployeeViewModelMessengerViewModel ,因此我不需要Employee View AdministratorViewModelQualityViewModel 然后,如何为员工视图注册仅所需的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM