Как ввести конвертер в XAML

У меня есть реализованный класс IValueConverter, и мне нужно, чтобы он был введен с помощью моего контейнера DI (Ninject).

проблема в том, что в XAML нет сразу очевидного способа получить контроль над экземпляром объекта конвертера.

Итак, мой XAML содержит строку примерно так:

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

где, ImagePathConverter будет создан для меня.

Я полагаю, что могу создать статический класс "service locator" и вызвать его, чтобы разрешить мою зависимость и изменить StaticResource на свойство "MyServiceLocator.TheImageConverter", но меня от этого тошнит.

Я надеюсь, что на этот вопрос можно ответить несколькими фрагментами кода, которые специально предназначены для поставляемого кода - и, возможно, вспомогательной ссылкой на пример. Не просто рекомендация посмотри где-нибудь.

также, что очень важно, предположим, что XAML нет кода

2 ответов


общий способ справиться с этим-для вашего конвертера также быть MarkupExtension. То есть:

public class MyConverter : MarkupExtension, IValueConverter

код ProvideValue() метод может возвращать экземпляр вашего конвертера, что позволяет использовать его следующим образом:

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

это на самом деле не имеет ничего общего с DI, но это касается вашего требования устранить код позади. Я действительно не вижу смысла регистрировать конвертеры в вашем контейнере DI.


альтернативный подход заключается в том, чтобы разрешить зависимость через MarkupExtension и установите его в свойство конвертера в XAML.

см. следующий ответ по реквизитам:

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