powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как Binding преобразует значения из разных типов?
11 сообщений из 11, страница 1 из 1
Как Binding преобразует значения из разных типов?
    #39991023
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похожей информации много, но я не могу найти именно то, что мне нужно. Или я не туда смотрю ...

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

Скажем, есть DependentcyProperty типа double. Мы можем привязать его к свойству типа Int32, и такая привязка будет работать правильно.

Как я могу сделать то же самое в коде, не вызывая исключения?
Использует ли привязка промежуточное преобразование в строку?

Демо-код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
        int i = 10;

        bool x = i is double; // false

        bool y = TypeDescriptor.GetConverter(typeof(double)).IsValid(i); // false

        bool z = TypeDescriptor.GetConverter(typeof(double)).IsValid(i.ToString()); // true



Текущие реализации метода, но мне они очень не нравится:
Код: c#
1.
2.
3.
4.
5.
6.
7.
    public static TResult Convert<TResult>(object value)
    {
        string str = value.ToString();
        if (TypeDescriptor.GetConverter(typeof(TResult)).IsValid(str))
            return (TResult) TypeDescriptor.GetConverter(typeof(TResult)).ConvertFrom(str);
        return default;
    }


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        public static TResult ConvertFrom<TResult>(object value)
        {
            if (value is TResult result)
                return result;
            if (TypeDescriptor.GetConverter(typeof(TResult)).IsValid(value))
                return (TResult) TypeDescriptor.GetConverter(typeof(TResult)).ConvertFrom(value);
            try
            {
                return (TResult)Convert.ChangeType(value, typeof(TResult));
            }
            catch (Exception)
            {
                try
                {
                    return (TResult)value;
                }
                catch (Exception)
                {
                    if (TypeDescriptor.GetConverter(typeof(TResult)).IsValid(value.ToString()))
                        return (TResult)TypeDescriptor.GetConverter(typeof(TResult)).ConvertFrom(value.ToString());
                }
            }
            return default;
        }



Также существует вариант создания скрытого DependecyProperty и использования его для преобразования.
Но наследование от DependcyObject только ради механизма преобразования кажется мне плохой идеей.

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

Поэтому прошу либо объяснить этот механизм, либо дать ссылку на исходный код, используемый привязками.
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991114
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создаешь конвертор, ставишь точку остановки в методе Convert, открываешь окно "Call Stack", смотришь как это устроена.
всё же просто
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991166
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, мне же в Binding надо залезть!
Где там точку останова поставить?

Сам биндинг - это просто MarkupExtension.
Вся "работа" по конвертации спрятана внутри DependecyObject (наверное).
Но где именно я не смог разобраться.
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991184
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

Есть такие типы BindingOperations и BindingExpression, именно там реализована логика работы связывания, а Binding это просто расширение разметки и не более.

вот в этом месте, видно, как применяется конвертер пользовательский и конвертер по умолчанию, если честно, то мне крайне лень вникать в тонкости реализации, так как не возникало такой необходимости и вряд ли возникнет.
https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Data/BindingExpression.cs,43c3ed4a53141207,references
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991204
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, да - похоже это именно, то что я искал.
Буду пытаться разобраться.
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991220
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дефолтный конфертер используется, если он нужен, его можно создать, и нет пользовательского. Вот тут дефолтный конвертер создается: https://referencesource.microsoft.com/#PresentationFramework/src/Framework/MS/Internal/Data/DefaultValueConverter.cs,63
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991226
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, там все типы конвертеров Intenal, к сожалению.
Надо или скопировать их, или ещё что придумать.
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991300
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp
Сон Веры Павловны, там все типы конвертеров Intenal, к сожалению. Надо или скопировать их, или ещё что придумать.

Зачем? Они же создаются автоматически.
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991653
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, мне же во внешнем коде надо сделать полностью идентичную конвертацию значения из одного типа в другой.
Или как-то по иному можно решить эту задачу?
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991669
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как Binding преобразует значения из разных типов?
    #39991697
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, он конвертирует только в основные системные типы.
И может использоваться только с типами у которых есть интерфейс IConvertible .
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как Binding преобразует значения из разных типов?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]