Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778

IValueConverter зачем два object?

04.01.2019, 17:37. Показов 2407. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зачем два обекта здесь?

C#
1
2
3
4
5
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
 
 
        }
Есть ли где нормальная расшифровка по этой штуке?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2019, 17:37
Ответы с готовыми решениями:

IValueConverter и параметры
Как в IValueConverter передать имя столбца DataGrig? Вопрос может быть странный, но мне нужно отображать элемент в ячейках одной строки в...

WindowState, Binding, IValueConverter
Доброго времени суток. Возникла интересная проблемка: Во время инициализации приложения размер окна должен быть определенным...

Не работает преобразование значений при биндинге (IValueConverter)
<Button Click="btnMinimize_Click" Cursor="Hand" Height="10" Margin="5,0,0,0" Name="btnMinimize" Style="{DynamicResource...

39
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
06.01.2019, 00:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Какая-то "кривая" реализация....
забыт атрибут CallerMemberName

Добавлено через 8 минут
Такое же или похожее решение используется во всяких Prism, ReactiveUI и прочих фреймворках.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.01.2019, 00:24
Цитата Сообщение от Lexeq Посмотреть сообщение
забыт атрибут CallerMemberName

Такое же или похожее решение используется во всяких Prism, ReactiveUI и прочих фреймворках.
Мне обычная реализация типа в посте от Рядовой Нечеткий поиск, как-то кажется разумнее и удобнее.
Хотя, возможно, дело в привычке.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
06.01.2019, 00:50
Цитата Сообщение от Элд Хасп Посмотреть сообщение
обычная реализация
в ней, кстати, тоже можно использовать этот атрибут
C#
1
2
        public void OnPropertyChanged([CallerMemberName]string prop = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
и Set будет выглядеть так
C#
1
2
3
4
5
set
{
   somePropField = value;
   OnPropertyChanged();
}
SetProperty позволяет придерживаться принципа DRY. Например, как в приведенное реализации, проверка на равенство нового значения старому перед генерацией события будет в одном месте. Можно даже сделать два метода Raise и RaiseIfChanhed (чтоб не дергать лишний раз обновления связанных элементов) и вызывать где какой нужен.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.01.2019, 01:08
Цитата Сообщение от Lexeq Посмотреть сообщение
в ней, кстати, тоже можно использовать этот атрибут
Я это знаю.
Мне непонятны зачем сложности с отдельным методом? Тем более, что как Вы пишите, это распространённый приём.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
06.01.2019, 01:17
Элд Хасп, вторая часть моего сообщения как раз про это. Вся логика по созданию события будет в одном месте и не надо будет в случае чего править логику в куче сеттеров.
0
HF
06.01.2019, 01:57

Не по теме:

Вот чего взялись обсуждать-то этот атрибут? По-моему даже от темы отошли. ;)

Можно ещё вспомнить PropertyChanged.Fody и обсудить его нужность. :)

0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
06.01.2019, 17:18  [ТС]
Элд Хасп,

По теме: по IMultiValueConverter,

Было у Вас такое, что один конвертер виден как класс в Create Data Binding --> Add value converter? А другого нет и все.

Добавлено через 19 минут
В смысле нет в списке, в рамках конкетного проекта и в папке Converters.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.01.2019, 17:24
Цитата Сообщение от Bulky Посмотреть сообщение
Было у Вас такое, что один конвертер виден как класс в Create Data Binding --> Add value converter? А другого нет и все.
В смысле нет в списке, в рамках конкетного проекта и в папке Converters.
Конвертер это такой же класс как и другие. Должны быть установлены нужные ссылки и юсинги.
Общую рекомендацию дать трудно - посмотрите какой класс, какое пространство имён, подключена ли нужная библиотека, проект, папка и т.д.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 12:58  [ТС]
Конвертер "любезно" воспринимает этот код и как надо его обрабатывает.
Однако есть теоретический вопрос. Каким образом "понимается" Что это Brush именно того UC?
Есть конечно мысли и у меня. Но все же.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
 
            Console.WriteLine(values[0]); // Console auxiliary debugger
            Console.WriteLine(values[1]);
            Console.WriteLine(values[2]);
 
 
            bool? state_0 = values[0] as bool?; //initialization of Boolean vars
            bool? state_1 = values[1] as bool?;
            bool? state_2 = values[2] as bool?;
 
 
 
 
            if (state_0 == true && state_1 == false && state_2 == true) // the first drawing, 
                return Brushes.Aqua;
                //return Canvas_1.Visibility = Visibility.Visible; // пока не работает
 
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.01.2019, 13:07
Цитата Сообщение от Bulky Посмотреть сообщение
Каким образом "понимается" Что это Brush именно того UC?
А зачем это ему понимать? Он в неведение откуда Вы передали ему значения. Он их получил из values (из остальных: targetType, parameter, culture - тоже может получает, но Вы их не используете), обработал и вернул результат обработки. Типичная работа любого метода.
Просто по названию и сигнатуре надо соблюдать соглашения, чтобы WPF элементы могли его использовать в привязках.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 13:10  [ТС]
C#
1
  return Brushes.Aqua;
Не... другое.

Откуда знает чей в каком месте Brush? Делать Aqua.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.01.2019, 13:54
Цитата Сообщение от Bulky Посмотреть сообщение
Откуда знает чей в каком месте Brush? Делать Aqua.
Он не знает!
Вы же в XAML указываете в привязке какого свойства используете конвертер. Это свойство и использует возвращаемое значение.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 14:31  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы же в XAML указываете в привязке какого свойства используете конвертер. Это свойство и использует возвращаемое значение.
Думаю он знает и свойству, и черз resource. Т.е. знает кто им пользуется.

XML
1
2
3
4
5
6
7
 <UserControl.Resources>
 
 
       <Converters:BooleanToBrushConverter x:Key="BooleanToBrushConverter" /> 
 
      
 </UserControl.Resources>
Т.к. в теле самого конвертера ни слова, ни об одном свойстве которое используются.

Добавлено через 9 минут
Более того, для другого UC (например планируется отличающаяся от первого логика) нужно использовать другой конвертер (Имя класса). Даже если конвертирование предполагается такое же BooleanToBrush.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.01.2019, 14:57
Цитата Сообщение от Bulky Посмотреть сообщение
Думаю он знает и свойству, и черз resource. Т.е. знает кто им пользуется.
Нет!
В ресурсах всего лишь создаётся экземпляр конвертера, чтобы к нему можно было обращаться из XAML.
Использовать Вы его можете с любым элементом, в любом свойстве. Главное чтобы он по функции свой подходил.
Цитата Сообщение от Bulky Посмотреть сообщение
Т.к. в теле самого конвертера ни слова, ни об одном свойстве которое используются.
И не будет!
Конвертер это такой же класс как и все остальные. Он может знать только ту информацию которую ему передают.
Вы можете использовать этот же конвертер в коде C# без всякой привязки к какому-либо свойству.
Цитата Сообщение от Bulky Посмотреть сообщение
Более того, для другого UC (например планируется отличающаяся от первого логика) нужно использовать другой конвертер (Имя класса). Даже если конвертирование предполагается такое же BooleanToBrush.
НЕТ!
Если он подходит по функциональности, можно и нужно использовать этот же.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 15:09  [ТС]
Не согласен! Практика показывает другое.

Ну да ладно. В #29
закомментированная строка.
C#
1
//return Canvas_1.Visibility = Visibility.Visible; // пока не работает
Вопрос как из класса конвертера добраться до стандартного свойства Canvas_1, что в UC.
0
HF
 Аватар для HF
1342 / 926 / 202
Регистрация: 09.09.2011
Сообщений: 2,754
Записей в блоге: 2
11.01.2019, 15:10
Цитата Сообщение от Bulky Посмотреть сообщение
Т.к. в теле самого конвертера ни слова, ни об одном свойстве которое используются.
Конвертеры не типизированы. В этом можно убедиться в документациях и официальных примерах. Поэтому всё что вы можете - придерживаться правил:
- если конвертер называется BooleanToBrushConverter значит он конвертирует значение типа Бул в тип Brush
- если конвертер писали вы, значит должны понимать что сделали
- если конвертер писали не вы, можете убедиться что там то о чём написано
для безопасности
- в начале кода метода конвертера ставят проверку типа входящего значения. Стандартный блок проверки, как делают в конструкторах при проверке на пустое значение.

Ваши явные ошибки:
- Вы сами себе "подкладываете свинью", не проверяя результат на null. А спокойно начинаете проверять условие.
C#
1
bool? state_0 = values[0] as bool?;
- и странно что вам студия или компилятор ошибку не выдал - нет результата. Или вы часть кода затёрли. Но return только один, из условия.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 15:12  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Ваши явные ошибки:
- Вы сами себе "подкладываете свинью", не проверяя результат на null. А спокойно начинаете проверять условие.
Спасибо за участие и совет. Речь не об ошибках (их нет, по крайней мере явных). Конвертер работает как надо.Устраивает.
Суть вопроса в другом, в #29. А на null проверять надо, -согласен.
0
HF
 Аватар для HF
1342 / 926 / 202
Регистрация: 09.09.2011
Сообщений: 2,754
Записей в блоге: 2
11.01.2019, 15:18
Цитата Сообщение от Bulky Посмотреть сообщение
Вопрос как из класса конвертера добраться до стандартного свойства Canvas_1, что в UC.
Вам уже много раз объясняли - нельзя этого делать. Вы нарушаете целостность программы. Цель конвертера - переписать входящее значение в другое.

Простой пример: Вы когда хотите узнать сумму денег по курсу доллара. Вы просто умножаете сумму рублей на курс (фиксированное значение). На выходе - сумма в долларах. Но конвертер же не проверяет - живёте ли лы в москве или в польше, вокруг вас снег или вы на лодке плывёте. Он сделал то что нужно - преобразовал один вид в другой.

Хотите зависимые значения - работайте в VM уже с готовыми данными, которые знают про окружение и имеют доступ к разным другим сущностям, к которым они имеют доступ.

Добавлено через 2 минуты
Цитата Сообщение от Bulky Посмотреть сообщение
//return Canvas_1.Visibility = Visibility.Visible; // пока не работает
Вот это вообще не понятно. Причём тут это свойство и что это за странное назначение.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
11.01.2019, 15:50  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Вот это вообще не понятно. Причём тут это свойство и что это за странное назначение.
Это коммент-напоминалка. Говорит о том что, Bulky не забудь либо "смастрячить" еще один конвертер, например BooleanToVisibility, или ищи пути попроще.
Вот и спросил "о путях" у Элд Хасп,

Добавлено через 24 минуты
Цитата Сообщение от HF Посмотреть сообщение
- если конвертер называется BooleanToBrushConverter значит он конвертирует значение типа Бул в тип Brush
Это заблуждение, Вы можете назвать конвертер как хотите, например MetersToParrots. А подавать на него Boolean и снимать Visibility. Имеет значение только, что Вам нужно Single или Multi vars конвертер.
0
HF
 Аватар для HF
1342 / 926 / 202
Регистрация: 09.09.2011
Сообщений: 2,754
Записей в блоге: 2
11.01.2019, 15:58
Цитата Сообщение от Bulky Посмотреть сообщение
Это заблуждение
Вы точно читали всё моё сообщение? Ключевое начало:
Цитата Сообщение от HF Посмотреть сообщение
Поэтому всё что вы можете - придерживаться правил:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2019, 15:58

Непостоянное исключение Cannot access a disposed object. Object name: 'System.Net.Sockets.NetworkStream'
Добрых времени суток. Код прост - отправляет данные на сервер и принимает результат с оного. Исключение появляется рандомно, плюс это...

NullreferenceExeption was unhandled Object reference not set to an instance of an object
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Object = Object или как сравнить два объекта?
Люди, Край надо сравнить два объекта: Типа Set Obj1 = Form1 Set Obj2 = Form2 If Obj1 = Obj2 then ... Но VB говорит, что...

Зачем используется приведение к Object в Stack<T>.Contains()?
Зачем используется приведение к Object в Stack&lt;T&gt;.Contains()?

Зачем оператору lock в качестве параметра нужен объект (object)
Зачем оператору lock в качестве параметра нужен объект (object) lock (lockObject) { //... }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru