多个实例ViewModel和ViewModelLocator

时间:2011-05-04 10:23:56

标签: unity-container mvvm-light viewmodellocator

我使用Unity构建了一个ViewModelLocator,并且已经成功地将它与单例ViewModel实例一起使用。例如:

public class ViewModelLocator
{
    private static readonly UnityContainer Container;

    static ViewModelLocator()
    {
        Container = new UnityContainer();

        if (ViewModelBase.IsInDesignModeStatic)
        {
            //Design Time Data Services
            Container.RegisterType<IMyServiceServiceAgent, DesignMyServiceServiceAgent>();
        }
        else
        {
            //Real Data Services
            Container.RegisterType<IMyServiceServiceAgent, MyServiceServiceAgent>();
        }

        Container.RegisterType<TreeViewViewModel>(new ContainerControlledLifetimeManager());
    }

    public TreeViewModel ViewModel
    {
        get
        {
            return Container.Resolve<TreeViewModel>();
        }
    }
}

ViewModelLocator被定义为App.xaml中的资源:

<Application.Resources>
    <ResourceDictionary>
        <VMS:ViewModelLocator x:Key="ViewModelLocator" d:IsDataSource="True"/>
    </ResourceDictionary>
</Application.Resources>

这允许我在任何视图中绑定到ViewModel,如下所示:

DataContext="{Binding TreeViewModel, Source={StaticResource ViewModelLocator}}" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=False}"

我的问题是如何使用同一ViewModel的多个实例保持相同的模式(和可混合性)?

我已经在这篇文章中找到了我想要做的事情 How to have multiple pairs "View-ViewModel"?但它没有涉及实施细节。

我希望能够做的是为不同的数据树提供这些Views / ViewModel对的多个实例,允许在它们之间进行复制和粘贴等但是却无法想到如何使用容器来满足ViewModelLocator中的特定实例?

我假设我需要某种ViewModel集合,如上所述,但我如何在Unity容器中注册该集合以及如何在View中绑定它?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我在你的情况下做的是仍然有一个ViewModel用于视图,但有另一个ViewModel保存可以更改的数据。

例如,如果我有一个显示用户信息的UserView控件,我有一个UserViewModel通过ViewModelLocator绑定到该视图。我还有一个UserModel类,可以根据正在查看/编辑的当前用户进行更改。此UserModel类继承自ViewModelBase,并由UserViewModel类通过属性公开。在应用程序的其他地方,如果选择了一个用户,我将UserViewModel的User属性设置为我想要在UserView中显示的UserModel。