使用MVVMLight ViewModelLocator时,如何在我的应用程序中注册和注销多个ViewModel?

问题是我希望能够告诉应用程序哪个ViewModel应该被注册以及哪个未注册。我的应用程序中有14个ViewModel(其中很少有像SessionViewModel这样在后台运行的 View ,它确定了所有 View 的当前 session 状态)

编辑

我的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中的 View 访问ViewModel,我使用了:
DataContext="{Binding Source={StaticResource Locator}}"

LoginViewModel应该适用于所有 View 。举个例子:Employee View将仅使用CallViewModelEmployeeViewModelMessengerViewModel,因此我不需要Employee View AdministratorViewModelQualityViewModel。然后,如何为员工 View 注册仅需要的ViewModel?

最佳答案

我认为您需要花一些时间来明确计划此应用程序的目标。

这些寄存器函数在您的ViewModel定位器构建/应用加载期间被调用。在您创建资源之前,它们不会消耗资源-当 View 绑定(bind)到 View 模型时会发生这种情况。因此,其他尚未“打开”的 View 模型尚不存在。

如果“关闭” View /窗口/用户控件,则 View 模型仍然存在。这可能是有好处的,因为它允许您保留VM的“状态”,以便在再次打开 View 时保留数据等。您将必须找出一种刷新所有记录集的方法。

您可以对 View 模型使用unregister函数,它将从缓存中删除:

SimpleIoc.Default.Unregister(AdministratorViewModel);

但是,如果这样做,则必须先注册它,然后才能再次使用。那么,为什么要这样做,是为了清除内存?大多数VM都是单例的,在应用程序的整个生命周期内存在它们是正常的。

您关于LoginViewModle应该可用于所有 View 的声明引发了警报。 View 模型本应包含在“工作单元”中,并且VM不应真正与其他VM通信(但是有一些异常(exception)-因此mvvmLight中的Messenger功能)。您是否考虑过使用服务来保存每个 View 模型都需要使用的功能/业务逻辑。 SImpleIOC的依赖项注入(inject)旨在实现此目的。我有一个UserService,可以登录用户并跟踪用户的设置和权限。然后将此服务注入(inject)需要它的每个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) {   }
        }

定义服务然后实现(允许进行测试),然后可以将其注入(inject)WM构造函数中:
Public Class AdministratorViewModel
{

    Private IUserService _UserService;

    Public New(IUserService UserService)
    {

        Try {
            _UserService = UserService;

        } catch (Exception ex) {

        }
    }
}

而且由于此用户服务是单例,因此注入(inject)的所有 View 模型都可以访问其功能和数据,这使您的应用程序无需担心。

希望这可以帮助您确保朝正确的方向前进

JK

10-08 02:04