Я немного осмотрел рефлектор .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
, который также используется внутри преобразователей значений по умолчанию.
Однако это будет сложно, так что ... не очень простое решение вашей проблемы.
Как продолжает говорить Мерлин, я начинаю верить, что рефлексия может быть более подходящим способом.