gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:01 24 4
gpt4 key购买 nike

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

问题是我希望能够告诉应用程序应该注册哪些 ViewModel 以及哪些未注册。我的应用程序中有 14 个 ViewModel(其中很少有人像 SessionViewModel 那样在后台工作,它确定所有 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。那么,如何才能为 Employee View 注册只需要的 ViewModel?

最佳答案

我认为您需要花一些时间来清楚地规划您为此应用程序的目标。

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

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

您可以对 View 模型使用取消注册功能,它将从缓存中删除:

SimpleIoc.Default.Unregister(AdministratorViewModel);

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

您关于 LoginViewModle 应该可用于所有 View 的声明引起了警报。 View 模型旨在包含“工作单元”,并且 VM 不应该真正与其他 VM 通信(但有一些异常(exception) - 因此 mvvmLight 中的信使功能)。您是否考虑过使用服务来保存需要对每个 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

关于c# - 如何使用 MVVM Light ViewModelLocator 处理多个 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33501503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com