Стандартный IValueConverter - PullRequest
       1

Стандартный IValueConverter

4 голосов
/ 07 ноября 2011

У меня есть простой IValueConverter, который просто использует TypeConverter для выполнения преобразований. Однако в некоторых случаях предоставленный TypeConverter завершится неудачей.

Я бы хотел вернуться к тому, что использовал бы WPF, если бы Binding не был снабжен конвертером. Используя отражатель, я определил, что существует DefaultValueConverter, однако он является внутренним по отношению к MS.Internal.Data.

Есть ли простой способ, которым я могу взять в руки DefaultValueConverter или что-то, что делает то же самое?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

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

Вам нужно быть точным, чтобы вызвать метод

internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource);

в классе MS.Internal.Data.DataBindEngine.

Вы получите текущий DataBindEngine для запущенного потока со статическим внутренним свойством

 internal static DataBindEngine CurrentDataBindEngine

Всегда в классе DataBindEngine.

Проблема в том, что класс является внутренним!

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

Вы можете использовать рефлексию для доступа к внутренним членам, но это будет очень плохой грязный хак! Для этого необходимо получить доступ к статическому свойству DataBindEngine.CurrentDataBindEngine, а затем получить доступ к методу GetDefaultValueConverter, всегда с отражением. Обертывание статической функции с атрибутом [устарело]:)

Вероятно, более простой способ - просто использовать рукописное преобразование по умолчанию.

Вы можете просто попытаться понять, почему это приводит к ошибке, или написать код, который может обработать особые случаи. Их код довольно сложен и взаимосвязан, я бы не советовал копировать их код.

Иногда WPF злит меня, многие вещи, связанные с привязкой данных, являются скрытыми, внутренними или недостаточно общими, и это действительно плохой выбор дизайна, который я не понимаю.

Старый TypeConverter иногда достаточно. Это зависит от того, что вы должны сделать.

public static object MyConvert(object value, Type t)
{
    TypeConverter tc = TypeDescriptor.GetConverter(t);
    return tc.ConvertFrom(value);
}

Вы также можете попробовать статический метод Convert.ChangeType, который работает с IConvertible.

Полагаю, проблема не в преобразовании вашего объекта, а в преобразовании его в значение, используемое свойством зависимости (или наоборот). Для этой цели существует открытый класс XamlValueConverter, который также используется внутри преобразователей значений по умолчанию. Однако это будет сложно, так что ... не очень простое решение вашей проблемы.

Как продолжает говорить Мерлин, я начинаю верить, что рефлексия может быть более подходящим способом.

0 голосов
/ 07 ноября 2011

Поскольку DefaultValueConverter является внутренним для MS.Internal.Data, лучше всего создать собственную версию конвертера значений по умолчанию

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