![](/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.