Mvvm 视图模型多次实例化。(棱镜)
我有一个带有工具栏的主视图和一个TabControl区域,该区域注册了两个视图:视图a和视图B。所有视图都应该具有相同的ContactsViewModel实例作为DataContext,但实际上,每个视图都在创建ContactsViewModel的新实例 这是隐藏的主视图代码: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
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我找到了!!!