Мне удалось настроить DI с помощью Unity:
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<MainWindowViewModel>();
container.RegisterType<PageConsignmentsViewModel>();
container.RegisterType<MainWindow>();
container.RegisterType<PageConsignments>();
var mainWindow = container.Resolve<MainWindow>();
var pc = container.Resolve<PageConsignments>();
mainWindow.Show();
}
MainWindow.xaml.cs
public partial class MainWindow : Window
{
[Dependency]
public MainWindowViewModel ViewModel
{
set => DataContext = value;
}
public MainWindow()
{
InitializeComponent();
}
}
MainWindowViewModel.cs
public class MainWindowViewModel : BaseViewModel
{
private Page currentPage;
public Page CurrentPage { get { return currentPage; } set { currentPage = value; OnPropertyChanged("CurrentPage"); } }
private readonly ApplicationDbContext db;
public MainWindowViewModel(ApplicationDbContext db)
{
this.db = db;
CurrentPage = new PageConsignments();
}
#region Navigation Menu Commands
...
#endregion
}
И я вижу, что Db
был введен в MainWindow
и DataContext
является правильным (новыйэкземпляр MainWindowViewModel
).
Однако, когда я перехожу к ConsignmentsPage
с помощью CurrentPage = new PageConsignments
, я вижу, что ConsingmentsPage.DataContext
является нулевым - вероятно, потому что это новое представление не находится в моем контейнере Unity.
Я думаю, что мне удалось решить эту проблему с помощью:
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<PageConsignmentsViewModel>();
var pc = container.Resolve<PageConsignments>();
CurrentPage = pc;
, но мне было интересно - это рекомендуемый метод, или есть какой-то способ, которым я могу определить все этиDI в App.OnStartup
вместо создания нового контейнера для каждой навигации?