8

我有一个主ViewModel目录,其中包含我正在使用的一定数量的项目列表,UserControls这些项目显示在ContentControl主视图的 a 中。我目前在存在对 main中的每一个和每个main 中的ViewModels一个进行引用之间交换数据的方式。但是我不知道这是不是这样做的正确方法,因为我有一个并且我有点希望这个类有一些功能来支持这样的东西。ViewModelsViewModelViewModelUserControlViewModelLocator

谁能告诉我我在做什么,或者在 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;
    }
...
4

3 回答 3

17

您实际上可以使用 ViewModelLocator。默认情况下使用 Inversion of Control Container,因此即使您创建 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 用于视图(用户控件或窗口或其他)

<UserControl
    ... 
    DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"
    ...    >
于 2013-06-04T08:45:57.337 回答
1

If all you need is to bind a property from the main viewmodel, while inside the content control, just use this syntax:

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

where xxxx is the Name attached to the content control (or any control that has the main viewmodel as its DataContext). Alternatively, you can use relative binding instead of element name.

于 2015-04-04T22:44:34.143 回答
1

您可以通过从 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
     {
     ...
     }
}

相似主题

于 2017-01-03T23:17:51.487 回答