【问题标题】:How to inject a Converter in XAML如何在 XAML 中注入转换器
【发布时间】:2010-10-28 09:36:55
【问题描述】:

我有一个 IValueConverter 实现类,我需要使用我的 DI 容器 (Ninject) 注入它。

问题是,在 XAML 中,没有直接明显的方法来控制 Converter 对象的实例化。

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

Source="{Binding Path=CurrentMessage, Converter={StaticResource ImagePathConverter}}"

ImagePathConverter 将在哪里为我创建。

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

我希望这个问题可以通过一些专门针对所提供代码的 sn-ps 代码来回答 - 或许还有一个示例的支持链接。不仅仅是建议去某个地方看看。

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

【问题讨论】:

  • 我很想知道您为什么需要使用 DI 解决转换器..?
  • 因为转换器使用 (depends) 格式化类,该类具有它自己的依赖关系,并且每个依赖关系也可能具有依赖关系。这就是 DI 的重点——为我连接所有这些依赖项。我想知道是否有很多人只是用它来新建对象而没有意识到主要目的?
  • 如果我理解正确,您实际上并不想将 Converter 本身注入另一个类,但您想将依赖项注入转换器,对吧?

标签: wpf xaml dependency-injection


【解决方案1】:

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

public class MyConverter : MarkupExtension, IValueConverter

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

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

这实际上与 DI 没有任何关系,但它确实满足了您消除背后代码的要求。我真的不明白在你的 DI 容器中注册转换器的意义。

【讨论】:

  • 谢谢,这是对转换器的公平关注。通过没有看到将转换器注册到 DI 容器的要点,我认为您假设 DI 容器只是用于“新建”对象。关键是有问题的 Converter 类具有其他依赖项,只能由 DI 容器解决(例如,在单例范围内注册的“配置”对象)
  • 我认为这是一个很好的答案,当我可以修复错误“映射指令中缺少 XmlNamespace、Assembly 或 ClrNamespace”时,我会回到它(即尽管添加了 xmlns:local=" clr-namespace:MyNamespace"
  • 知道了!修复了错误,它工作得很好。我仍然需要在 ProvideValue 方法中以服务定位器方式调用我的 DI,但我认为没有任何办法)
【解决方案2】:

另一种方法是通过MarkupExtension 解决依赖关系并将其设置为XAML 中转换器的属性。

详情请看以下答案:

https://stackoverflow.com/a/41611854/2115905

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 2015-03-09
    • 2011-05-31
    • 2011-02-25
    • 1970-01-01
    • 2011-10-10
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多