В своем проекте я использую :
Microsoft.Extensions.DependencyInjection;
CommunityToolkit.Mvvm;
При старте приложения в App.xaml.cs:
public partial class App : Application
{
private ServiceProvider serviceProvider;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
serviceProvider = serviceCollection.BuildServiceProvider();
var authViewModel = serviceProvider.GetRequiredService<AuthViewModel>();
var authWindow = new AuthWindow { DataContext = authViewModel };
authWindow.Show();
}
private void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<IDialogService, DialogService>();
services.AddSingleton<ExaminationWindow>();
services.AddTransient<ExaminationViewModel>();
services.AddTransient<TimetableViewModel>();
services.AddSingleton<TimetableUserControl>();
services.AddTransient<MainViewModel>();
services.AddTransient<AuthViewModel>();
services.AddSingleton<MainWindow>();
services.AddSingleton<AuthWindow>();
}
}
Конструктор AuthViewModel:
public AuthViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
}
AuthWindow.xaml.cs:
public AuthWindow()
{
InitializeComponent();
}
И все запускается нормально, так же у меня UserControl в котором представлено расписание, который находится в MainWindow, MainWindow через сервис открывается после успешного входа в AuthWindow.
NavigationService:
public NavigationService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void ShowMainWindow()
{
var timetableViewModel = _serviceProvider.GetRequiredService<TimetableViewModel>();
var timetableUserControl = new TimetableUserControl { DataContext = timetableViewModel };
var mainWindow = _serviceProvider.GetRequiredService<MainWindow>();
mainWindow.table = timetableUserControl;
mainWindow.Show();
}
Конструктор TimetableViewModel:
public TimetableViewModel(IDialogService dialogService)
{
_dialogService = dialogService;
FullSchedule = new ObservableCollection<Timetable>(Timetable.SetTimetable(GlobalState.Instance.CurrentUser.Id));
Test = "12345";
}
TimetableUserControl:
public TimetableUserControl()
{
InitializeComponent();
}
Но этот код выдает ошибку после входа и выдает что InitializeComponent(); System.NullReferenceException: "Object reference not set to an instance of an object." Пытался решить различными способами, дошел до такого вида программы, как я думал это решит проблему, но нет. В чем заключается проблема и как ее можно исправить?