如何在 WPF 中使用依赖注入服务将 ViewModel 绑定到视图

问题描述 投票:0回答:1

背景:

我使用 Microsoft.Extensions.DependencyInjection 在 WPF 应用程序中实现了依赖项注入。

应用程序.xaml.cs

protected override async void OnStartup(StartupEventArgs e)
{
    AppHost = Host.CreateDefaultBuilder()
        .ConfigureServices((hostContext, services) =>
        {
            services.AddTransient<IFileRepository, FileRepository>();
            services.AddSingleton<MainWindow>();

        }).Build();

    await AppHost!.StartAsync();
    var startupForm = AppHost.Services.GetRequiredService<MainWindow>();
    startupForm.Show();

    base.OnStartup(e);
}

在我的 OpenProjectViewModel 中,我注入 fileRepository。

public IFileRepository fileRepository { get; }
public OpenProjectViewModel(IFileRepository _fileRepository)
{
    fileRepository = _fileRepository;
}

在 OpenProjectView.xaml 中我设置了数据上下文

<UserControl.DataContext>
    <local:OpenProjectViewModel/>
</UserControl.DataContext>

问题

当该应用程序启动时,它不喜欢我在 OpenProjectViewModel 中没有无参数构造函数。当我在 OpenProjectViewModel 中添加无参数构造函数时,应用程序启动,但 fileRepository 为空,因为它尚未被注入。

问题

有没有办法让应用程序知道在使用 OpenProjectViewModel 时何时应该注入 FileRepository?我按照这个指南来设置 DI。但 Tim 向您展示了如何在视图代码隐藏中进行设置。

如果我错过分享任何内容,请告诉我。 感谢您提前提供的所有帮助。

c# wpf dependency-injection .net-6.0
1个回答
3
投票

除非依赖无参数构造函数,否则无法在 XAML 中实例化视图模型。

你应该使用

AppHost.Services.GetRequiredService <MainWindowViewModel>()

并将代码中

DataContext
MainWindow
设置为结果。

然后会将

IFileRepository
作为参数传递给构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.