使用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中的View中访问ViewModel我已经使用过:
DataContext="{Binding Source={StaticResource Locator}}"
LoginViewModel应该适用于所有视图。例如:Employee View
仅使用CallViewModel
,EmployeeViewModel
和MessengerViewModel
,因此我不需要Employee View
AdministratorViewModel
和QualityViewModel
。那么,我如何只为Employee View注册所需的ViewModel?
答案 0 :(得分:4)
我认为您需要花一些时间来明确规划此应用的目标。
在viewmodel定位器构造/ app加载期间调用这些寄存器函数。在创建资源之前,它们不会消耗资源 - 这是在视图绑定到视图模型时发生的情况。所以其他不“开放”的视图模型尚不存在。
如果“关闭”视图/窗口/用户控件,则视图模型仍然存在。这可能是一个好处,因为它允许您保持VM的“状态”,以便在再次打开视图时保留数据等。您必须找到一种方法来刷新您拥有的任何记录集。
您可以对viewmodels使用取消注册功能,它将从缓存中删除:
In addition, the following coprocessors instructions are defined for specific registers accesses:
MRRC Read access to the Debug ROM Address Register, DBGDRAR, and the Debug Self Address Offset
Register, DBGDSAR, in an implementation that includes the Large Physical Address Extension.
STC Read access to the Host to Target Data Transfer Register, DBGDTRRXint.
LDC Write access to the Target to Host Data Transfer Register, DBGDTRTXint.
Form of MRC and MCR instructions
The form of the MRC and MCR instructions used for accessing debug registers through the CP14 interface is:
MRC p14, 0, <Rt>, <CRn>, <CRm>, <opc2> ; Read
MCR p14, 0, <Rt>, <CRn>, <CRm>, <opc2> ; Write
Where <Rt> refers to any of the ARM core registers R0-R14. Use of R13 is UNPREDICTABLE in Thumb and
ThumbEE states, and is deprecated in ARM state. <CRn>, <CRm>, and <opc2> are mapped from the debug register
number as shown in Figure C6-1
The use of the MRC APSR_nzcv form of the MRC instruction is permitted for reads of the DBGDSCRint only. Use with
other registers is UNPREDICTABLE. See CP14 interface 32-bit access instructions, required in all versions of the
Debug architecture on page C6-2124 for more information.
For accesses to the debug registers, <CRn> <= 0b0111 and therefore bit[10] of the value in the figure is 0.
10 9 8 7 6 5 4 3 2 1 0
Value 0 Register number[9:0]
Arguments CRn[3:0] opc2[2:0] CRm[3:0]
Figure C6-1 Mapping from debug register number to CP14 instruction arguments
但如果你这样做,你必须先注册才能再次使用。那么你为什么要这样做,是为了清理记忆呢?大多数VM都是单例,并且在应用程序的生命周期内存在它们是正常的。
您对LoginViewModle应该可用于所有视图的声明会引发警报。视图模型意味着包含“工作单元”,VM不应该真正与其他VM通信(但有一些例外 - 因此mvvmLight中的信使功能)。您是否考虑过使用服务来保存每个视图模型都需要的功能/业务逻辑。 SImpleIOC的依赖注入旨在实现这一点。我有一个UserService,用于登录用户并跟踪用户设置和权限。然后将此服务注入到需要它的每个VM的构造函数中。例如:
SimpleIoc.Default.Unregister(AdministratorViewModel);
您定义一个服务然后实现它(允许测试),但是您可以将它注入到WM构造函数中:
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) { }
}
因为这个用户服务是一个单例,所有注入它的视图模型都可以访问它的函数和数据,这样可以保持应用程序关注点的分离。
希望这有助于确保您朝着正确的方向前进
JK