Как загружаются PRISM V4 Views без параметризованного конструктора? - PullRequest
2 голосов
/ 03 апреля 2012

У меня вопрос о том, как загружаются представления.У меня есть этот пример кода, показанный ниже представления, которое загружается правильно:

    [ViewExport(RegionName = RegionNames.LeftRegion)]
[PartCreationPolicy(CreationPolicy.Shared)]
public partial class EmployeeListView : UserControl
{
    [ImportingConstructor]
    public EmployeeListView(EmployeeListViewModel viewModel)
    {
        InitializeComponent();
        //this.DataContext = viewModel;
    }

    [Import]
    public EmployeeListViewModel Model
    {
        get
        {
            return DataContext as EmployeeListViewModel;
        }
        set
        {
            DataContext = value;
        }
    }
}

Примечания по поводу кода выше:

  1. Я добавил атрибут [ImportingConstructor] в параметризованный конструктор, которыйПередача в ViewModel.
  2. У меня также есть атрибут [Import] для установщика ViewModel, поэтому я могу назначить DataContext.

Однако в демонстрационной версии Stocktrader загрузка представленийсделано по-другому.Посмотрите, например, на файл PositionSummaryView.xaml.cs.

[ViewExport(RegionName = RegionNames.MainRegion)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class PositionSummaryView : UserControl
{
    public PositionSummaryView()
    {
        InitializeComponent();
    }

    #region IPositionSummaryView Members

    [Import]
    public IPositionSummaryViewModel Model
    {
        get
        {
            return DataContext as IPositionSummaryViewModel;
        }
        set
        {
            DataContext = value;
        }
    }
    #endregion
}

У меня следующие вопросы:

  1. Как создается экземпляр View без атрибута [Importing Constructor] длякласс, как показано в предыдущем примере?
  2. Что вызывает присвоение свойства DataContext?Как значение передается в свойство ViewModel?Играя с модифицированной версией StockTrader, я создал новый вид.если поместить точку останова рядом со строкой DataContext = значение, точка останова никогда не будет достигнута.

1 Ответ

2 голосов
/ 10 апреля 2012

Нет смысла добавлять [ImportingConstructor] в ваш конструктор, если вы не собираетесь ничего с этим делать в вашем конструкторе.С другой стороны, если ваш экземпляр EmployeeListViewModel является обязательной зависимостью для EmployeeListView, то вы, вероятно, должны передать его через конструктор.

Двойной импорт вызоветследующее:

  1. Тип будет создан с атрибутом [ImportingConstructor], позволяющим вводить экземпляр EmployeeListViewModel.
  2. Свойство Model будет введено сэкземпляр EmployeeListViewModel после создания экземпляра типа.

Должен ли EmployeeListViewModel выполнять какие-либо тяжелые действия во время создания экземпляра (например, для доступа к базе данных или службе), и создается как не совместно используемая часть ([PartCreationPolicy(CreationPolicy.NonShared)]), тогда вы излишне создаете экземпляр партии дважды и удваиваете свою работу.Если часть является общей, это не проблема.

В ответ на ваши вопросы, однако,

  1. MEF безразлично использует конструктор по умолчанию (PositionSummaryView() { }) для любых типовкоторые не имеют конструктора, помеченного ImportingConstructorAttribute.Таким образом, в случае PositionSummaryView он будет проверять атрибут украшения [ImportingConstructor], не найдет его, поэтому будет использовать конструктор по умолчанию.
  2. [Import] удовлетворяется после того, как тип былпостроен.Я был бы удивлен, что точка останова не была достигнута, хотя ... Я бы проверил ваш режим сборки (Debug | Release) и т. Д.
...