Вам не хватает конфигурации для некоторых зависимостей. Из кода, который вы опубликовали, вы пропустили настройку IJMDataIntegration
и IBalanceIntegrationContext
:
protected override async void OnStartup(StartupEventArgs startupEventArgs)
{
base.OnStartup(startupEventArgs);
ServiceCollection services = new ServiceCollection();
services.AddScoped<MainWindow>();
services.AddScoped<ScaleInterfacePage>();
services.AddScoped<IJMDataIntegration, JMDataIntegration>();
services.AddScoped<IBalanceIntegrationContext, BalanceIntegrationContext>();
services.AddScoped<IScale>(provider => new Scale("1234"));
services.AddScoped<ScaleIntegrationViewModel>();
ServiceProvider serviceProvider = services.BuildServiceProvider();
MainWindow mainWindow = serviceProvider.GetService<MainWindow>();
mainWindow.Show();
}
Кроме того, как уже упоминалось, вы должны также вставить модель представления в MainWindow
. Здесь, где начинается график зависимостей, root приложения:
partial class MainWindow : Window
{
public MainWindow(ScaleIntegrationViewModel viewModel)
{
this.DataContext = viewModel;
}
}
Чтобы включить полную мощность Dependency Injection (и сделать насмешку проще), вы должны использовать Dependency Inversion во всем приложении. Это означает, что вы должны зависеть только от интерфейсов и, следовательно, иметь только типы интерфейсов в своих конструкторах:
partial class MainWindow : Window
{
public MainWindow(IScaleIntegrationViewModel viewModel)
{
this.DataContext = viewModel;
}
}
Элементы управления, подобные страницам, должны генерироваться с помощью DataTemplate
, а не создаваться непосредственно в XAML. Все, что вам нужно сделать, это вставить модели просмотра страницы, например, в другую модель представления. Свяжите их с ContentPresenter
и определите неявный DataTemplate
, который нацелен на тип модели представления страницы. Этот шаблон содержит актуальную страницу. Посмотрите этот пример .
Найдите шаблон View-Model-First, если вам нужна дополнительная информация. По сути, представление может быть определено как шаблон данных и связано с типом модели представления. Шаблоны данных могут быть определены как ресурсы, или они могут быть определены внутри элемента управления, который будет отображать модель представления. Содержимое элемента управления является экземпляром модели представления, а шаблон данных используется для его визуального представления. Этот метод является примером ситуации, в которой сначала создается экземпляр модели представления, а затем создается представление.
Это предпочтительный способ, особенно в сочетании с внедрением зависимости.