ViewModel не инициализируется при представлении представления (WPF PRISM 4 MVVM) - PullRequest
2 голосов
/ 22 февраля 2011

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

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 

     }
 }

1 Ответ

2 голосов
/ 22 февраля 2011

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

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

...