繁体   English   中英

使用Autofac解决XAML中的依赖关系

[英]Resolving dependencies in XAML using Autofac

我的应用程序中有一个MyResource类,如下所示:

public class MyResource : IMyResource
{
    // ... whatever ...
}

当我在App.xaml.cs中初始化应用程序时,使用Autofac会得到类似的结果:

builder.Register<IMyResource>(container => new MyResource());

现在,我需要在WPF应用程序的Window中添加一个StaticResource ,如下所示:

<Window.Resources>
    <local:MyResource x:Key="MyResource" />
</Window.Resources>

但是,当然,整个想法不是在这里引用MyResource的具体实例。 此外,我可能需要在应用程序的不同WindowUserControl使用MyResource的实例。 因此,我想将MyResource的实例用作通过Autofac容器解析的WindowStaticResource 我该如何实现?

我当时正在考虑在Window的代码后面添加资源,但是这可能会导致我不需要的容器依赖项。

初始化应用程序时,我还考虑在App.xaml.cs中执行类似的操作:

App.Current.MainWindow.Resources.Add("MyResource", container.Resolve<IMyResource>());

但是当我在XAML中使用资源时

<ListBox ItemsSource="{Binding Source={StaticResource ResourceKey=MyResource}}"/>

我收到一个XAMLParseException ,它XAMLParseException内部异常消息,指出找不到名为MyResource的资源。 即使工作正常,我仍感觉有点臭。

那么如何实现呢? 有可能吗? 如果不是,最好的方法是什么?

跟着这些步骤

  • 向Autofac注册MyWindowMyResource
  • IMyResource放置在MyWindow的构造函数中(是的,您正在修改后面的代码,但是您不是在引用容器。如果您无法在代码隐藏代码中使用代码-也许您是UserControl-那么请确保有人在在某处设置DataContext
  • DataContext设置为IMyResource的具体实例(在构造函数中),或者如果您使用的是MVVM,则将该实例放入您的视图模型(也将在Autofac中注册)。
  • 解决MyWindow

在代码中:

MyWindow(IMyResource myResource) : this()
{
  DataContext = myResource;
}

如果您使用的是ViewModel(也已在Autofac中注册):

MyWindow(MyViewModel viewModel) : this()
{
  DataContext = viewModel;
}

将此行添加到您的XAML:

<Window.DataContext><local:IMyResource></Window.DataContext>

或这个:

<Window.DataContext><local:MyViewModel></Window.DataContext>

然后,您对ListBox的标记变得微不足道:

<ListBox ItemsSource="{Binding}"/>

或者,使用viewmodel作为属性Items ,例如:

<ListBox ItemsSource="{Binding Items}"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM