2017-01-02 16 views
0

У меня есть главный вид с панелью инструментов и областью TabControl, которая имеет два вида зарегистрированных: View A, View B. Все представления должны иметь в качестве DataContext один и тот же экземпляр ContactsViewModel, но на самом деле каждое представление создает новый экземпляр ContactsViewModel.Просмотр модели, созданной не один раз. (PRISM)

Это основной вид кода за:

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; } 
    } 
} 

View 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(); 
    } 

} 

Как я могу использовать ContactsListView (здесь называется View A), чтобы иметь тот же экземпляр ContactsViewModel, что и MainView?

Editted

код в главном и вид в Editted так в главном представлении я зарегистрировать ViewModel в контейнер и в View А я Устраните ViewModel. Еще три экземпляра. Когда модель просмотра разрешена, создается новый экземпляр.

+0

Похоже, вы получаете 'ContactViewModel' из контейнера IoC. Вы задумались о том, чтобы зарегистрировать это как одноэлемент? –

+0

Я только что попробовал, и у меня все еще есть три экземпляра ContactsViewModel. (Я изменил свой вопрос с новым кодом). Я сделал это: в главном представлении я зарегистрирую ContactViewModel в контейнере; в представлении A Я разрешаю ContactsViewModel из контейнера. Это ты имел в виду? Что такое ocurring, так это то, что каждый раз, когда я разрешаю ContactsViewModel, создается новый экземпляр. – chincheta73

+0

Вы не регистрируете модель представления как одноэлементный. Узнайте, как это сделать: https://msdn.microsoft.com/en-us/library/ff647854.aspx –

ответ

0

Как предложил Ричардс, я установил этот вопрос путем регистрации ViewModel как синглтон:

container.RegisterInstance<ContactsViewModel>(contactsViewModel);