как параметризовать импорт в представлении?

Я ищу помощи, и я надеюсь, что какая-то добрая душа сможет дать мне подсказку :)

Я создаю новое приложение, используя MVVM Light. В этом приложении при создании представления создается экземпляр соответствующей модели представления с помощью импорта MEF.

Вот код:

public partial class ContractEditorView : Window
{
    public ContractEditorView ()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);
    }

    [Import(ViewModelTypes.ContractEditorViewModel)]
    public object ViewModel
    {
        set
        {
            DataContext = value;
        }
    }
}

А вот экспорт для ViewModel:

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(ViewModelTypes.ContractEditorViewModel)]
public class ContractEditorViewModel: ViewModelBase
{
    public ContractEditorViewModel()
    {
        _contract = new Models.Contract();
    }
}

Теперь это работает, если я хочу открыть новое окно, чтобы создать новый контракт... или, другими словами, это идеально, если мне не нужно передавать идентификатор существующего контракта.

Однако предположим, что я хочу использовать тот же вид для редактирования существующего контракта. В этом случае я бы добавил в тот же вид новый конструктор, который принимает либо идентификатор модели, либо объект модели.

«К сожалению», ViewModel создается всегда одинаково:

    [Import(ViewModelTypes.ContractEditorViewModel)]
    public object ViewModel
    {
        set
        {
            DataContext = value;
        }
    }

Насколько я знаю, это вызывает конструктор стандарта/без параметров соответствующей ViewModel во время композиции.

Так что я хотел бы знать, как дифференцировать это поведение? Как я могу вызвать конкретный конструктор во время композиции? Или как я могу передать некоторые параметры во время импорта?

Я очень извиняюсь, если этот вопрос звучит глупо, но я только недавно начал использовать MEF!

Заранее спасибо,

Здоровья, Джанлука.


person Anthares    schedule 07.06.2010    source источник


Ответы (1)


Ты можешь это сделать. Ознакомьтесь с реализацией Messenger в MVVM-Light. Вы можете передать NotificationMessage(Of Integer), чтобы отправить правильный идентификатор в модель представления. Модель представления должна зарегистрироваться для этого типа сообщения и загрузить его при отправке сообщения.

Импорт MEF по умолчанию имеет только конструктор без параметров.

person Rick Ratayczak    schedule 01.07.2010