2009-05-23 46 views
8

我有一个IValueConverter实现的类,我需要使用我的DI容器(Ninject)注入它。如何在XAML中注入转换器

问题是,在XAML中,没有立即明显的方式来控制Converter对象的实例化。

所以我的XAML包含一行是这样的:

来源= “{绑定路径= CurrentMessage,转换器= {StaticResource的ImagePathConverter}}”

其中,在ImagePathConverter会为我创建。

我想我可以创建一个“服务定位器”静态类,并调用它来解决我的依赖关系,并将StaticResource更改为属性“MyServiceLocator.TheImageConverter”,但这使我想呕吐。

我希望这个问题可以用一些代码片段来回答,这些代码片段专门针对提供的代码 - 也许是一个示例的支持链接。不只是一个建议去看看的地方。

此外,非常重要的是,假设XAML 没有代码隐藏 - 而且我不能使用它。我正在创建一个皮肤,并且不想要代码。所以我不能在类的构造函数中设置一个类变量并引用它。也许这是不合理的,我还不确定。

+0

我想知道为什么你需要转换器与DI解决..? – NotDan 2009-05-23 04:36:20

+0

因为Converter使用(取决于)一个格式化类,它具有它自己的依赖关系,并且每个这些依赖关系也可能具有依赖关系。这是DI的全部重点 - 为我连接所有这些依赖关系。 我想知道如果很多人只是用它来新的对象,并没有意识到主要目的? – PandaWood 2009-05-23 10:45:16

回答

8

处理此问题的常见方法是让您的转换器也成为MarkupExtension。那就是:

public class MyConverter : MarkupExtension, IValueConverter 

ProvideValue()方法可以返回你的转换器的实例,从而使您可以使用它像这样:

Source="{Binding CurrentMessage, Converter={local:MyConverter SomeParameterToConverter}}" 

这是不是真的什么关系DI,但它确实符合您的要求,以消除背后的代码。我真的没有看到转换器注册到您的DI容器。