访问MVVM Light中其他ViewModel中的属性

Kry*_*oxx 8 c# mvvm-light

我有一个主要ViewModel包含我正在使用的一定数量的项目列表UserControls,它们显示在ContentControl主视图中.我现在的之间交换数据的方式ViewModels存在,使得每个的一个参考的ViewModels主ViewModel,主要的一个ViewModel在每一个UserControl.但是我不知道这是不是这样做的正确方法,因为我有一个ViewModelLocator,我希望这个类有一些功能来支持这样的事情.

任何人都可以告诉我,如果我正在做这个,或者在MVVM Light中有更好的方法吗?

编辑:

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

private ViewModelLocator locator = new ViewModelLocator();
Run Code Online (Sandbox Code Playgroud)

然后使用定位器属性来引用每个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;
    }
...
Run Code Online (Sandbox Code Playgroud)

eMk*_*Mko 17

您实际上可以使用ViewModelLocator.默认情况下使用Inversion of Control Container,因此即使您创建了Locator的新实例,您也将从容器中获得相同的singleton viewmodel实例.

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从代码中你可以访问它

var vm1 = (new ViewModelLocator ()).ViewModel1;
Run Code Online (Sandbox Code Playgroud)

你得到了viewmodel的唯一实例.

来自xaml:Resources(默认位于App.xaml中的Application.Resources)

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
Run Code Online (Sandbox Code Playgroud)

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

<UserControl
    ... 
    DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"
    ...    >
Run Code Online (Sandbox Code Playgroud)