我有一个IValueConverter实现的类,我需要使用我的DI容器(Ninject)注入它。
问题是,在XAML中,没有直接明显的方法可以控制Converter对象的实例化。
所以我的XAML包含这样的行:
Source =“{Binding Path = CurrentMessage,Converter = {StaticResource ImagePathConverter}}”
其中,将为我创建 ImagePathConverter 。
我想我可以创建一个“服务定位器”静态类并调用它来解析我的依赖关系并将StaticResource更改为属性“MyServiceLocator.TheImageConverter”,但这让我想要呕吐。
我希望这个问题可以通过一些专门针对所提供代码的代码片段来回答 - 也许是一个示例的支持链接。不仅仅是建议看看某个地方。
另外,非常重要的是,假设XAML 没有代码隐藏 - 并且我不能使用它。我正在创建一个皮肤并且不想要后面的代码。所以我不能在类构造函数中设置一个类变量并引用它。也许那是不合理的,我还不确定。
答案 0 :(得分:8)
处理此问题的常用方法是使转换器也为MarkupExtension
。那就是:
public class MyConverter : MarkupExtension, IValueConverter
您的ProvideValue()
方法可以返回转换器的实例,从而允许您像这样使用它:
Source="{Binding CurrentMessage, Converter={local:MyConverter SomeParameterToConverter}}"
这与DI没有任何关系,但它确实满足了消除背后代码的要求。我真的没有看到在DI容器中注册转换器的意义。
答案 1 :(得分:0)
另一种方法是,通过MarkupExtension
解决依赖关系并将其设置为XAML中的转换器属性。
有关详细信息,请参阅以下答案: