У меня есть два приложения, одно из которых - основное приложение, а другое - приложение формы дизайнера.Заменить ViewModel для просмотра с помощью другого ViewModel
На данный момент у меня есть основное приложение, работающее с призмой и мегафоном. Некоторые из представлений в моем основном приложении - это только формы ввода данных. То, что я хочу от моего приложения формы дизайнера, - это загрузить представление формы ввода данных, чтобы затем его можно было отредактировать, но для этого я хочу использовать другую модель представления для целей проектирования. Я не хочу, чтобы форма прикреплялась к обычной модели просмотра и пыталась получить данные и т. Д.
Как использовать MEF, чтобы я мог предоставить другой экспорт, чтобы он выбирал этот вариант вместо обычной модели просмотра? В идеале это просто заменило бы главную модель viewmodel приложения, поэтому вместо этого она использует это.
Это мой пример зрения, импортируя ViewModel
[Export("PatientDetailView")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class PatientDetailView : UserControl
{
[ImportingConstructor]
public PatientDetailView(PatientDetailViewModel viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
}
А вот основа моей ViewModel:
[Export(typeof(PatientDetailViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PatientDetailViewModel : ViewModelBase, IRegionManagerAware
{
[ImportingConstructor]
public PatientDetailViewModel(IEventAggregator eventAggregator, IDialogService dialogService, IRegionManager regionManager)
: base(eventAggregator, dialogService, regionManager)
{
//Contains Commands etc for Saving Patient Detail Record
//Receiving patient detail etc
}
}
UPDATE:
выше содержится в модуле пациента сборка. Это работает как для основного приложения. Для применения конструктора я хочу заменить вышеупомянутую модель представления что-то вроде ниже:
[Export(typeof(PatientDetailViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PatientDetailViewModel : ViewModelBase, IRegionManagerAware
{
[ImportingConstructor]
public PatientDetailViewModel(IEventAggregator eventAggregator, IDialogService dialogService, IRegionManager regionManager)
: base(eventAggregator, dialogService, regionManager)
{
//Contains Commands etc for Designing the form
//No commands from the original VM so changes how it tries to work.
}
}
выше работает переопределить поведение по умолчанию для моего основного приложения. Эта виртуальная машина будет содержаться в сборке конструктора или отдельной сборке designerVM.
Хорошо, спасибо за ответы. Моя проблема в том, что я не знаю, как включить только ViewModel, который я хочу. Поскольку основная виртуальная машина приложения всегда экспортируется, когда я включаю сборку с моим представлением. Я могу экспортировать свою другую виртуальную машину в моем приложении Designer, но затем есть два экспорта, можно ли заменить этот экспорт на новый? –
Не можете ли вы поместить каждый vm в отдельную сборку и включить только одну из этих сборок для каждого приложения? – stijn
Не совсем, ViewModel должен идти с View в той же сборке, никогда не видел их в другом месте. Это часть этого модуля, может показаться немного неправильной в другой сборке только для целей дизайнера. Я думал, что MEF все касается компонентов горячей замены. –