簡體   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