在MVVM Light中访问其他视图模型中的属性

本文关键字:模型 属性 视图 访问 MVVM Light 其他 | 更新日期: 2023-09-27 18:16:44

我有一个主要的ViewModel,其中包含我在一定数量的UserControls中使用的项目列表,这些项目显示在主视图上的ContentControl中。我目前在ViewModels之间交换数据的方式是在主ViewModel中引用每个ViewModels,在每个UserControl中引用一个主ViewModel。然而,我不知道这是这样做的正确方式,因为我有一个ViewModelLocator,我有点期望这个类有一些功能来支持这样的东西。

谁能告诉我,如果我在做这个OK,或者如果有一个更好的方法在MVVM光?

编辑:

当我在寻找不同的东西时,我发现了这个,这会是一个更好的解决方案吗?

private ViewModelLocator locator = new ViewModelLocator();

然后使用定位器属性来引用每个ViewModel?

EDIT2:

显然我认为会工作不,起初我只有在主要的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;
    }
...

在MVVM Light中访问其他视图模型中的属性

你实际上可以使用ViewModelLocator。默认情况下,它使用控制反转容器,所以即使你创建了定位器的新实例,你也会从容器中获得相同的单例视图模型实例。

定位器类:

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

:资源(默认在Application中)。App.xaml中的资源

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

和DataContext用于视图(用户控件或窗口或其他)

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

如果您需要的只是从主视图模型中绑定一个属性,而在内容控件中,只需使用以下语法:

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

,其中xxxx是附加到内容控件(或任何以主视图模型作为其DataContext的控件)的Name。或者,您可以使用相对绑定来代替元素名称。

你可以通过从app资源中获取定位器来编程地访问ViewModel定位器的公共属性:

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

或者在ViewModelLocator类中创建另一个静态实例:

public class ViewModelLocator
{
     public static ViewModelLocator Instance = new ViewModelLocator();
     static ViewModelLocator(){ ... }
     public MainViewModel Main
     {
     ...
     }
}

类似线程