Быстрый вопрос, у меня есть пара моделей представления, которые назначаются в ShellViewModel (экспорт использовался для этих 3 виртуальных машин)
[ImportingConstructor]
public ShellViewModel(MainWindowViewModel viewModel,
SelectionViewModel sViewModel,
GStatsViewModel gsViewModel)
{
mainWindowViewModel = viewModel;
selectionViewModel = sViewModel;
gStatsViewModel = gsViewModel;
}
Вопрос в том, что я хотел ввести "Сервис" вMainWindowViewModel.
Это служба
[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IObjService))]
public class ObjService : IObjService
{
private ObservableCollection<ObjA> objSource = new ObservableCollection<ObjA>();
public ObservableCollection<ObjA> ObjSource
{
get { return objSource; }
set
{
objSource= value;
NotifyPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
И в моем MainWindowViewModel
private ObjService objService;
// Can I use the importing constructor here?
public MainWindowViewModel(// something here?)
{
// Setup service
// or something here?
Вопрос в том, как я могу это сделать?Как MainWindowViewModel может иметь конструктор импорта, но работать так, как он работает в данный момент, как у меня в ShellViewModel?
Кроме того, это нормально?Я хочу, чтобы модели представления всегда имели одну и ту же ссылку на наблюдаемую коллекцию ObjA, поскольку она будет использоваться во всем мире ... так что же это путь вперед?
Спасибо
Мое приложениеиспользует архитектуру MVVM
РЕДАКТИРОВАТЬ
, если я делаю это
private ObjService objService;
[ImportingConstructor]
public MainWindowViewModel(ObjService serviceToUse)
{
// Setup service
objService = serviceToUse;
, я получаю исключение от Caliburn Micro, говоря
throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
Для IShell
В загрузчике я делаю
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue<IObjService>(new ObjService());
batch.AddExportedValue(container);
container.Compose(batch);
Если я изменяю конструктор на это в MainWindowViewModel, он работает ... Я не уверен, почему он работаетс интерфейсом, но не конкретным классом.Я думаю, это потому, что он все равно переводится в новый конкретный класс, так что вы должны дать ему интерфейс, правильно?
Часть, которая работает приватно IObjService objService;
[ImportingConstructor]
public MainWindowViewModel(IObjService serviceToUse)
{
// Setup service
objService = serviceToUse;