Как ввести конвертер в 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.
см. следующий ответ по реквизитам: