2011-02-22 3 views
2

Я использую PRISM4 MVVM Pattern, и представления загружаются успешно и отображаются в соответствующих регионах при запуске приложения. Когда приложение запускается, ViewModels автоматически инициализируются при загрузке представления. Однако, если я попытаюсь ввести новое представление на новую вкладку (новый регион), ViewModel нового представления не инициализируется. Вот код для инъекций вида:ViewModel не инициализируется в представлении Injection (WPF PRISM 4 MVVM)

IRegion region = regionManager.Regions["RegionNameGoesHere"]; 

var pane = new Views.ABCView() {Tag = id}; 
regionManager.Regions["RegionNameGoesHere"].Add(pane); 

Код выше открывает новую вкладку и загрузить новый вид, но не инициализирует ViewModel. Каждая вкладка элемента управления представляет собой новый регион (для элемента управления вкладками есть RegionAdapter).

Вот код позади зрения:

using System.ComponentModel.Composition; 
using System.Diagnostics.CodeAnalysis; 
using System.Windows.Controls; 
using Telerik.Windows.Controls; 
using Telerik.Windows.Controls.Docking; 

namespace Company.Application.Module.Assembly.Views 
{ 
    [Infrastructure.Behaviours.ViewExport("ABCView")] 
    [PartCreationPolicy(CreationPolicy.NonShared)] 
    public partial class ABCView : RadPane 
    { 
     public ABCView() 
     { 
      this.InitializeComponent(); 
     } 

     /// <summary> 
     /// Sets the ViewModel. 
     /// </summary> 
     /// <remarks> 
     /// This set-only property is annotated with the <see cref="ImportAttribute"/> so it is injected by MEF with 
     /// the appropriate view model. 
     /// </remarks> 
     [Import] 
     [SuppressMessage("Microsoft.Design", "CA1044:PropertiesShouldNotBeWriteOnly", Justification = "Needs to be a property to be composed by MEF")] 
     ABCViewModel ViewModel 
     { 
      set 
      { 
       this.Decorator.DataContext = value; 
       //this.DataContext = value; 
      } 
     } 
    } 
} 

И вот в ViewModel с несколькими свойствами и событиями. Я потерял что-то в приведенном выше коде, чтобы инициализировать ViewModel ниже. Любое предложение очень ценится.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel.Composition; 
using System.Linq; 
using System.ServiceModel; 
using System.ServiceModel.Description; 
using System.Text; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Xml; 
using System.Xml.XPath; 
using System.Windows.Data; 

using Microsoft.Practices.Prism.Commands; 
using Microsoft.Practices.Prism.Events; 
using Microsoft.Practices.Prism.Regions; 
using Microsoft.Practices.Prism.ViewModel; 

namespace Company.Application.Module.Assembly.Views 
{ 
    [Export(typeof(ABCViewModel))] 
    [PartCreationPolicy(CreationPolicy.NonShared)] 
    public class ABCViewModel : NotificationObject 
    { 
     private readonly IRegionManager regionManager; 

     [ImportingConstructor] 
     public ABCViewModel(IRegionManager regionManager) 
     { 
      // Event Aggregator 
      //this.eventAggregator = eventAggregator; 

      // Region Manager 
      this.regionManager = regionManager; 

     } 

     #region P R O P E R T I E S 

     #region E V E N T S 

    } 
} 

ответ

2

Проблема в том, что вы сами создаете представление, вместо того, чтобы создать CompositionContainer для него. CompositionContainer ничего не знает об объектах, которые вы создаете сами, поэтому, когда вы вызываете new Views.ABCView(), импорт не магически удовлетворен.

С сырым MEF вы можете вызвать CompositionContainer.GetExports(), чтобы получить представление из контейнера. Вероятно, в Призме есть какая-то инфраструктура, которая обертывает этот вызов, но я не очень разбираюсь в Prism, поэтому я точно не знаю, что это будет.

+0

Спасибо, Даниэль, это имеет смысл. Я собираюсь провести некоторое исследование, и если я найду решение, я отправлю его здесь. Спасибо –

+0

Вы нашли решение? – JohnC

+0

@JohnC Чтобы сделать более вероятным, что кто-то видит ваш комментарий, поставьте @ перед своим именем в своем комментарии, например, я делаю здесь с вашим именем. –

Смежные вопросы