簡體   English   中英

在MVVM Light中訪問其他ViewModel中的屬性

[英]Accessing Properties in other ViewModels in MVVM Light

我有一個主ViewModel其中包含我正在一定數量的UserControls使用的項的列表,這些項顯示在主視圖的ContentControl 我的電流之間交換數據的方式ViewModels存在使得對每個的一個參考的ViewModels在主ViewModel ,主要的一個ViewModel在每一個UserControl 但是我不知道這是這樣做的正確方法,因為我有一個ViewModelLocator並且我有點希望此類具有某些功能來支持此類功能。

誰能告訴我我在做什么,還是在MVVM Light中有更好的方法?

編輯:

我在尋找其他東西時發現了這個,這會是一個更好的解決方案嗎?

private ViewModelLocator locator = new ViewModelLocator();

然后使用定位器屬性來引用每個ViewModel?

編輯2:

顯然我認為不會起作用,起初,我在主ViewModel僅具有引用,並且起作用了,但是當我在UserControls嘗試該操作時,它會使我的應用程序崩潰。 我目前正在嘗試首次編輯的可能解決方案。

MainViewModel.cs(其他類似,僅參考主ViewModel)

public class MainViewModel : ViewModelBase
{
    private ItemAddViewModel itemAddViewModel;
    private ItemsViewModel itemsViewModel;

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        ItemsList = Item.GetItemsList();

        itemAddViewModel = ServiceLocator.Current.GetInstance<ItemAddViewModel>();
        itemsViewModel = ServiceLocator.Current.GetInstance<ItemsViewModel>();

        ShowItemsView();
    }
...
    private void ShowItemsView()
    {
        CurrentControl = itemsViewModel;
    }
...

您實際上可以使用ViewModelLocator。 默認情況下是使用“控制容器反轉”,因此,即使您創建了定位器的新實例,也將從容器中獲得相同的單例視圖模型實例。

Locator類:

static ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    SimpleIoc.Default.Register<ViewModel1>();
    SimpleIoc.Default.Register<ViewModel2>();
    SimpleIoc.Default.Register<ViewModel3>();
}

public ViewModel1 ViewModel1
{
    get
    {
        return ServiceLocator.Current.GetInstance<ViewModel1>();
    }
}

public ViewModel2 ViewModel2
{
    get
    {
        return ServiceLocator.Current.GetInstance<ViewModel2>();
    }
}

public ViewModel3 ViewModel3
{
    get
    {
        return ServiceLocator.Current.GetInstance<ViewModel3>();
    }
}

然后可以從代碼中訪問它

var vm1 = (new ViewModelLocator ()).ViewModel1;

您將獲得viewmodel的唯一實例。

來自xaml:資源(默認位於App.xaml中的Application.Resources中)

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

和用於視圖的DataContext(用戶控件或Windows或其他任何控件)

<UserControl
    ... 
    DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"
    ...    >

如果您只需要在內容控件內部綁定主視圖模型的屬性,則只需使用以下語法:

   ... Binding="{DataContext.mainvmpropertyname, ElementName=xxxx}"

其中xxxx是附加到內容控件(或任何具有主viewmodel作為其DataContext的控件)的名稱。 或者,您可以使用相對綁定代替元素名稱。

您可以通過從Apps資源獲取Locator來以編程方式訪問ViewModel Locator的公共屬性:

MyViewModel vm = (App.Current.Resources["Locator"] as ViewModelLocator).MyViewModel

或通過在ViewModelLocator類中創建另一個靜態實例:

public class ViewModelLocator
{
     public static ViewModelLocator Instance = new ViewModelLocator();

     static ViewModelLocator(){ ... }

     public MainViewModel Main
     {
     ...
     }
}

類似線程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM