Mvvm 视图模型多次实例化。(棱镜)

Mvvm 视图模型多次实例化。(棱镜),mvvm,view,prism,viewmodel,viewmodellocator,Mvvm,View,Prism,Viewmodel,Viewmodellocator,我有一个带有工具栏的主视图和一个TabControl区域,该区域注册了两个视图:视图a和视图B。所有视图都应该具有相同的ContactsViewModel实例作为DataContext,但实际上,每个视图都在创建ContactsViewModel的新实例 这是隐藏的主视图代码: public partial class ContactsView : UserControl { public IRegionManager regionManager; private static

我有一个带有工具栏的主视图和一个TabControl区域,该区域注册了两个视图:视图a和视图B。所有视图都应该具有相同的ContactsViewModel实例作为DataContext,但实际上,每个视图都在创建ContactsViewModel的新实例

这是隐藏的主视图代码:

public partial class ContactsView : UserControl
{
    public IRegionManager regionManager;

    private static Uri listViewUri = new Uri("/ContactsListView", UriKind.Relative);
    private static Uri tilesViewUri = new Uri("/ContactsTilesView", UriKind.Relative);

    public ContactsView(ContactsViewModel contactsViewModel, IRegionManager regionManager, IUnityContainer container)
    {
        this.ViewModel = contactsViewModel;
        container.RegisterType<ContactsViewModel>();
        this.regionManager = regionManager;
        InitializeComponent();
    }

    public ContactsViewModel ViewModel
    {
        get { return this.DataContext as ContactsViewModel; }
        set { this.DataContext = value; }
    }
}
public partial class ContactsListView : UserControl
{
    public ContactsListView(IUnityContainer container)
    {
        ContactsViewModel viewModel = container.Resolve<ContactsViewModel>();
        this.ViewModel = viewModel;
        InitializeComponent();

        SetupColumns();
    }

    public ContactsViewModel ViewModel
    {
        get { return this.DataContext as ContactsViewModel; }
        set { this.DataContext = value; }
    }
}
public部分类ContactsView:UserControl
{
公共IRegionManager区域管理器;
私有静态Uri listViewUri=新Uri(“/ContactsListView”,UriKind.Relative);
私有静态Uri tilesViewUri=新Uri(“/ContactsTilesView”,UriKind.Relative);
公共联系人视图(联系人视图模型联系人视图模型、IRegionManager区域管理器、IUnityContainer容器)
{
this.ViewModel=contactsViewModel;
container.RegisterType();
this.regionManager=regionManager;
初始化组件();
}
公共联系人视图模型视图模型
{
获取{将this.DataContext作为ContactsViewModel;}
设置{this.DataContext=value;}
}
}
这是代码隐藏的视图:

public partial class ContactsView : UserControl
{
    public IRegionManager regionManager;

    private static Uri listViewUri = new Uri("/ContactsListView", UriKind.Relative);
    private static Uri tilesViewUri = new Uri("/ContactsTilesView", UriKind.Relative);

    public ContactsView(ContactsViewModel contactsViewModel, IRegionManager regionManager, IUnityContainer container)
    {
        this.ViewModel = contactsViewModel;
        container.RegisterType<ContactsViewModel>();
        this.regionManager = regionManager;
        InitializeComponent();
    }

    public ContactsViewModel ViewModel
    {
        get { return this.DataContext as ContactsViewModel; }
        set { this.DataContext = value; }
    }
}
public partial class ContactsListView : UserControl
{
    public ContactsListView(IUnityContainer container)
    {
        ContactsViewModel viewModel = container.Resolve<ContactsViewModel>();
        this.ViewModel = viewModel;
        InitializeComponent();

        SetupColumns();
    }

    public ContactsViewModel ViewModel
    {
        get { return this.DataContext as ContactsViewModel; }
        set { this.DataContext = value; }
    }
}
public部分类ContactsListView:UserControl
{
公共联系人列表视图(IUnityContainer容器)
{
ContactsViewModel viewModel=container.Resolve();
this.ViewModel=ViewModel;
初始化组件();
SetupColumns();
}
公共联系人视图模型视图模型
{
获取{将this.DataContext作为ContactsViewModel;}
设置{this.DataContext=value;}
}
}
视图B与视图A类似

这是ViewModel:

public class ContactsViewModel : BindableBase
{
    private readonly IRegionManager regionManager;
    private readonly IEventAggregator eventAggregator;
    private readonly IConfigurationContactsService contactsService;

    private readonly DelegateCommand<object> deleteContactCommand;

    private ObservableCollection<Contact> contactsCollection;
    private ICollectionView contactsView;

    public ContactsViewModel(IEventAggregator eventAggregator, IConfigurationContactsService contactsService, IRegionManager regionManager)
    {
        this.regionManager = regionManager;
        this.contactsService = contactsService;
        this.eventAggregator = eventAggregator;

        this.deleteContactCommand = new DelegateCommand<object>(this.DeleteContact, this.CanDeleteContact);

        this.contactsCollection = new ObservableCollection<Contact>(contactsService.GetContacts());
        this.contactsView = CollectionViewSource.GetDefaultView(this.contactsCollection);
    }

    public ICollectionView ContactsView
    {
        get { return this.contactsView; }
    }
    public ObservableCollection<Contact> Contacts
    {
        get { return this.contactsCollection; }
    }

    public ICommand DeleteContactCommand
    {
        get { return this.deleteContactCommand; }
    }

    private void DeleteContact(object ignore)
    {
        IList<Contact> selectedContacts = contactsService.GetSelectedContacts();
        foreach (Contact contact in selectedContacts)
        {
            if (contact != null)
            {
                contactsService.DeleteContact(contact);
            }
        }
        SetProperty<ObservableCollection<Contact>>(ref this.contactsCollection, new ObservableCollection<Contact>(contactsService.GetContacts()), "Contacts");
    }
    private bool CanDeleteContact(object ignored)
    {
        return contactsService.GetSelectedContacts().Any();
    }

}
公共类ContactsViewModel:BindableBase
{
专用只读IRegionManager regionManager;
私有只读IEventagor事件聚合器;
专用只读IConfigurationcontacts服务contacts服务;
私有只读DelegateCommand deleteContactCommand;
私人可观察收集联系人收集;
私人ICollectionView联系人视图;
公共联系人IEWModel(IEventAggregator事件聚合器、IConfigurationcontacts服务联系人服务、IRegionManager区域管理器)
{
this.regionManager=regionManager;
this.contacts服务=contacts服务;
this.eventAggregator=eventAggregator;
this.deleteContactCommand=新的DelegateCommand(this.DeleteContact,this.CanDeleteContact);
this.contactsCollection=新的ObservableCollection(contactsService.GetContacts());
this.contactsView=CollectionViewSource.GetDefaultView(this.contactsCollection);
}
公共ICollectionView联系人视图
{
获取{返回this.contactsView;}
}
公开收集联系人
{
获取{返回this.contactsCollection;}
}
公共ICommand DeleteContactCommand
{
获取{返回this.deleteContactCommand;}
}
私有void DeleteContact(对象忽略)
{
IList selectedContacts=contacts服务。GetSelectedContacts();
foreach(选定联系人中的联系人)
{
如果(联系人!=null)
{
contactsService.DeleteContact(联系人);
}
}
SetProperty(参考this.contactsCollection,新的ObservableCollection(contactsService.GetContacts()),“Contacts”);
}
private bool CanDeleteContact(忽略对象)
{
返回contactsService.GetSelectedContacts().Any();
}
}
如何使ContactsListView(此处称为视图A)与MainView具有相同的ContactsViewModel实例

编辑的


在主视图中编码并查看已编辑的视图,因此在主视图中我将ViewModel注册到容器中,在视图A中我解析ViewModel。还有三个例子。解决视图模型后,将创建一个新实例。

正如Richards所建议的,我通过将viewmodel注册为singleton解决了这个问题:

container.RegisterInstance<ContactsViewModel>(contactsViewModel);
container.RegisterInstance(contactsViewModel);

您似乎正在从IoC容器中获取
ContactViewModel
。你有没有考虑过把它注册为一个单身汉?我刚试过这么做,我仍然得到了三个ContactsViewModel的实例。(我用新代码编辑了我的问题)。我所做的是:在主视图中,我将ContactsViewModel注册到容器中;在视图A中,我从容器解析ContactsViewModel。这就是你的意思吗?值得注意的是,每次我解析ContactsViewModel时,都会创建一个新实例。您没有将视图模型注册为单例。在这里学习如何做:谢谢@R.Richards我找到了!!!