1

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

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

当我在 App.xaml.cs 中初始化我的应用程序时,我使用 Autofac 有类似的东西:

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

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

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

但是,当然,整个想法并不是要引用这里的具体实例MyResource。此外,我可能需要在我的应用程序MyResource中使用不同Window或不同的实例。UserControl所以我想使用一个通过 Autofac 容器解析的MyResourceas a StaticResourcefor my实例。Window我怎样才能做到这一点?

我正在考虑在 my 的代码隐藏中添加资源Window,但它可能会创建对我不想要的容器的依赖。

当我初始化应用程序时,我也在考虑在 App.xaml.cs 中做类似的事情:

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

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

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

我收到了XAMLParseException哪个内部异常的消息,指出找不到名为 MyResource 的资源。即使它起作用了,我也觉得它有点臭。

那么如何实现呢?只有可能吗?如果不是,那么实现这一点的最佳方法是什么?

4

1 回答 1

1

按着这些次序

  • 注册MyWindowMyResource使用 Autofac。
  • 放置IMyResourceMyWindow(是的,您正在修改后面的代码,但您不是指您的容器的构造函数中。如果您不能在代码隐藏中包含代码 - 也许您是 UserControl - 然后确保有人正在设置DataContext某处)
  • 设置DataContextIMyResource(在构造函数中)的具体实例,或者如果您使用的是 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,作为 property Items,例如,它同样好:

<ListBox ItemsSource="{Binding Items}"/>
于 2012-06-24T16:51:00.433 回答