Как ввести конвертер в XAML - PullRequest
8 голосов
/ 23 мая 2009

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

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

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

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

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

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

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

Кроме того, очень важно, предположим, что XAML не имеет кода - и я не могу его использовать. Я создаю скин и не хочу код позади. Поэтому я не могу установить переменную класса в конструкторе класса и ссылаться на него. Может быть, это неразумно, я еще не уверен.

Ответы [ 2 ]

8 голосов
/ 23 мая 2009

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

public class MyConverter : MarkupExtension, IValueConverter

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

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

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

0 голосов
/ 12 января 2017

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

Подробнее см. В следующем ответе:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...