Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/32: Рейтинг темы: голосов - 32, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28

Хотелось бы понять, почему неправильно работает триггер

20.06.2021, 11:27. Показов 6578. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Набросал элементарный триггер для ToggleButton, а он в Checked режиме выводит пустую строку вместо заданной. Всё перерыл, неделю копался в отладчике -- всё должно работать, а не работает. Подскажите, пожалуйста, что я проморгал...
github: https://github.com/RayDIceman/testTriggerWpf
Если без него, то так:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    <UserControl.Style>
        <Style>
            <Style.Triggers>
                <Trigger Property="local:MyToggleButton.IsChecked" Value="False">
                    <Trigger.Setters>
                        <Setter Property="local:MyToggleButton.ArrowData" Value="M0,0L32,0 16,19.745z" />
                        <Setter Property="local:MyToggleButton.Text" Value="{Binding ElementName=uc, Path=OpeningText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                    </Trigger.Setters>
                </Trigger>
                <Trigger Property="local:MyToggleButton.IsChecked" Value="True">
                    <Trigger.Setters>
                        <Setter Property="local:MyToggleButton.ArrowData" Value="M16,0L32,19.745 0,19.745z" />
                        <Setter Property="local:MyToggleButton.Text" Value="{Binding ElementName=uc, Path=ClosingText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                    </Trigger.Setters>
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
В UserControl добавлены DP IsChecked, ArrowData, Text, OpeningText и ClosingText. Все, кроме IsChecked строковые.
И вот ClosingText никогда не появляется, не понимаю, почему.
если раскомментировать код, то всё ок, но не нравятся костыли. И так должно работать...
C#
1
2
3
4
5
6
7
private static void OnDPTextChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is MyToggleButton myd && ((string)e.NewValue == ""))
            {
                //myd.Text = myd.ClosingText;
            }
        }
Заранее спасибо за помощь!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2021, 11:27
Ответы с готовыми решениями:

Не могу понять, почему программа неправильно работает!
Изучаю С++ по Страуструпу Б. - Программирование. Принципы и практика использования C++. Есть задание: 9. Вычислите сумму введенных...

Программа работает неправильно (не так, как хотелось бы)
Здравствуйте! Есть задача: &quot;Определите, можно ли вычеркнуть из данного массива одно число так, чтобы оставшиеся числа оказались...

Не могу понять, почему программа работает неправильно( Знаю, что где-то ошибки, но не могу найти
{Ввести последовательность натуральных чисел Aj j=1...n (n&lt;=1000). Упорядочить последовательность по неубыванию наименььшей цифры...

58
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 17:16  [ТС]
Студворк — интернет-сервис помощи студентам
По моему скромному мнению, всё, что позволяет язык, должно работать. если что-то не работает в частном случае, значит это нельзя использовать. Ну, это, как, если бы
C#
1
int a, b, c; c= a+b;
иногда бы считалось как разница, иногда -- как произведение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
20.06.2021, 17:28
Цитата Сообщение от Ray DIceman Посмотреть сообщение
По моему скромному мнению, всё, что позволяет язык
Вот именно скромному мнению.
К спеку языка это не имеет никакого отношения.

Добавлено через 2 минуты
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Ну, это, как, если бы
Пример некорректный.

У вас есть значение по умолчанию присваиваемое полю при создании экземпляра класса - это то что делает сеттер.
Но вы при создании экземпляра сами изменили это значение на нужное вам.
Что вы теперь удивляетесь что там не значение по умолчанию?

Добавлено через 1 минуту
Это простой случай, для обычного поля.
Которому можно присвоить значение только ДВУМЯ разными способами: по умолчанию и явно при создании экземпляра.
А у DP свойства ОДИНАДЦАТЬ разноприоритетных способа задать значение.
1
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 18:55  [ТС]
1. При создании экземпляра поле Text пустое.
2. Оно меняется триггером, как и предписано XAML.
3. Значение берётся не из свойства зависимости.
если свойство зависимости Text изменить так:
C#
1
2
3
4
5
6
7
8
9
10
11
        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(MyToggleButton), new PropertyMetadata("", OnDPTextChange));
 
        private static void OnDPTextChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is MyToggleButton myd && ((string)e.NewValue == ""))
            {
                myd.Text = myd.ClosingText;
            }
        }
то всё работает правильно, значит, сама запись в DP Text работает нормально. Не работает чтение из DP ClosingText в триггере.
Это странно. Как будто в этом случае не срабатывает OnPropertyChanged какое-нибудь...
Ворос, как я уже говорил, академический. Хочу разобраться, несмотря на...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
20.06.2021, 19:41
Цитата Сообщение от Ray DIceman Посмотреть сообщение
1. При создании экземпляра поле Text пустое.
Значение заданное при регистрации свойства называется значением по умолчанию.
У него самый низкий приоритет.

Добавлено через 2 минуты
Цитата Сообщение от Ray DIceman Посмотреть сообщение
если свойство зависимости Text изменить так:
А явно присвоенное значение свойству myd.Text =... называется локальным.
И у него почти самый высокий приоритет.
После такого присвоения игнорируются все привязки, сеттеры и триггеры в шаблонах и стилях.

Добавлено через 1 минуту
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Не работает чтение из DP ClosingText в триггере.
Я же показал что всё работает, если не пытаться идти против прописанной логики приоритетов.

Добавлено через 2 минуты
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Не работает чтение из DP
Не ЧТЕНИЕ!
"Ломается" сеттер <Setter Property="local:MyToggleButton.Text" Value=.....
И триггер его использующий сам тоже "вылетает".
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 19:47  [ТС]
Элд Хасп, при всём уважении, триггер успешно записывает пустое значение. Никто не говорит об ошибке. должен же я в отладчике увидеть это "вылетает", нет?
P.S. Ну я тупоооой, похоже.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
20.06.2021, 20:07
Лучший ответ Сообщение было отмечено Ray DIceman как решение

Решение

Цитата Сообщение от Ray DIceman Посмотреть сообщение
Никто не говорит об ошибке. должен же я в отладчике увидеть это "вылетает", нет?
Нет.
Возможно (даже наверняка) есть какие-то продвинутые средства отладки WPF, но Студия на это не способна.

Цитата Сообщение от Ray DIceman Посмотреть сообщение
Ну я тупоооой, похоже.
Дело не в этом, а в том что вместо решение своей задачи занимаетесь поисками причин "не правильной" работы WPF.
Это ОЧЕНЬ сложно.
И без явной необходимости этим точно не стоит заниматься.

Посмотрите тему: Непростое Решение для простой часто встречающейся задачи. Привязка TextBox к численному свойству.
И в этой теме мною только КОРОТКО и не полно описано всё что я сделал для детального разбора проблемы.
Я потратил полторы-две недели для того чтобы во всём этом разобраться.

Тоже самое стили.
Вы воспринимаете их как подпрограмму.
И это специально так реализовано чтобы упростить для программистов создание XAML.

Но попробуйте создать стиль "руками".
Это очень сложная многоиерархическая коллекция разнообразных объектов совершенно независимая от того объекта (UI элемента) который будет её использовать.
И любой стиль могут использовать одновременно множество различных объектов в совершенно разных Окнах или даже вне Окон, а где-то в недрах Шарп кода.
Только для того чтобы разобраться как всё это работает надо детально просмотреть и ПОНЯТЬ несколько тысяч (или даже десятков тысяч) строк исходного кода.

Да, если это ОЧЕНЬ нужно, то этим можно заняться.
Как я сделал в вышеуказанной теме, так как это частовстречаемая проблема.
Но настолько ли вам нужно разбираться почему один неправильный сеттер работает, а другой неправильный не работает?
В любом случае они неправильные.
И не надо так делать.

Но если для вас это принципиально и вы хотите досконально в этом разобраться- кто вам мешает?
Открывайте исходники и вперёд!
1
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 21:42  [ТС]
Да, это не нужно, но безумно интересно, и, наверняка, принесёт в дальнейшем пользу.

Добавлено через 11 минут
Элд Хасп, и, вот что хотите со мной делайте, я должен понять, почему эти сеттеры неправильные. А я, пока, не понимаю. контрол. триггер на изменение собственного DP. сеттеры триггера изменяют опять-таки значение собственного DP. Уверен, почему то, что, если бы это был не CustomControl, всё бы работало. Впрочем, ничто не мешает попробовать. Лвдно, Эльдар, спасибо Вам за помощь и пинки в нужную сторону.

Добавлено через 1 минуту
Понял.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
20.06.2021, 21:52
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Понял.



Цитата Сообщение от Ray DIceman Посмотреть сообщение
если бы это был не CustomControl
Так вы уже CustomControl сделали?
Покажите тогда его полный код.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
21.06.2021, 14:52  [ТС]
Элд Хасп, в процессе. покажу. Я, видимо, ошибся. хотел сказать ~"если бы это был не UserControl/если бы это был CustomControl"

Добавлено через 4 часа 0 минут
Да то же самое, вид сбоку: Обычный текст триггер изменяет, DP не читает.
https://github.com/RayDIceman/CustomControlTrigger
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.06.2021, 19:55
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Обычный текст триггер изменяет, DP не читает.
Вы обычными словами опишите, что хотите реализовать.
Конкретно каждый пункт алгоритма и какой вид для каждого пункта.

Именно "ЧТО", а не "КАК".

И скиньте мне приглашение на соавторство.
Акк EldHasp с аватаркой как здесь на Форуме.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
21.06.2021, 20:55  [ТС]
Элд Хасп, Я всем, вроде, доступ открыл...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
21.06.2021, 20:56
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Я всем, вроде, доступ открыл...
На просмотр.
Чтобы скинуть изменения нужно ещё приглашение на соавторство.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
22.06.2021, 15:29  [ТС]
Элд Хасп, Всё. https://github.com/RayDIceman/CustomControlTrigger, с вашей помощью полнлстью разобрался. Хоть и считаю, что дОлжно было работать и по-моему. Очевидно, цепочка Binding-а принудительно обрывается, нельзя делать её длинной и ветвистой.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
22.06.2021, 15:43
Цитата Сообщение от Ray DIceman Посмотреть сообщение
В репе только одно пустое Окно.

Добавлено через 1 минуту
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Хоть и считаю, что дОлжно было работать и по-моему
XAML - декларативный язык ВИЗУАЛЬНОЙ РАЗМЕТКИ.
А вы хотите на нём реализовать Бизнес Логику UI элемента.
Это не правильно.
БЛ реализуется на Шарпе.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
22.06.2021, 16:15  [ТС]
Добавлено через 7 минут
mvvm же для чего-то сделали. Такая приятная вещь, и такая хилая :-)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
22.06.2021, 16:21
Цитата Сообщение от Ray DIceman Посмотреть сообщение
mvvm же для чего-то сделали
А это здесь при чём?
MVVM - это паттерн реализации ООП Решений, а не отдельных UI элементов.
Это адаптация MVC/MVP под особенности и инструменты WPF.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
22.06.2021, 17:03  [ТС]
При чём... Дали возможность разделить BL и UI, для этого ввели разметку и развили в ней, в частности, использование триггеров, анимации,... Получилось красиво. По поводу "не отдельных UI элементов"... С отдельных элементов начинается весь UI. и триггеры -- тоже БЛ отдельных элементов, они же есть. ладно, я, может, не прав в своих желаниях прекрасного и идеального. не будем холиварить. Спасибо. Инструмент нужно использовать до границ, на которые он способен. И знать эти границы очень важно. Спасибо, что помогли мнре их понять!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
22.06.2021, 21:54
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Дали возможность разделить BL и UI
Разделяют View и Model паттерны MVC(78г.) и MVP (начало 90-x).
Привязки были ещё в Формах с Framework 1.1 (2003г.)
WPF (Avalon) точно не помню, где-то 2002-2004 г.
В составе Framework с 2006.
MVVM представлен как адаптация MVC/MVP под особенности WPF в 2005г.

То есть разделение UI и БЛ идея минимум на четверть века старше WPF и MVVM.
Эта идея является логическим применением принципов ООП и SOLID на реализацию Решения в целом.

Цитата Сообщение от Ray DIceman Посмотреть сообщение
для этого ввели разметку и развили в ней, в частности, использование триггеров, анимации,...
Но это разметка ВИЗУАЛЬНОГО вида UI.
А не как не полноценный язык для реализации Бизнес Логики.

UI элемент разделяется функционально на две части.
Логическая - определяющая его состояние.
Логическую часть иногда называют Поведением элемента.
При этом UI элемент НЕ ДОЛЖЕН влиять на представляемые данные.
Допустим в вашем случае в свойство Text поступает строка от внешнего источника.
Вы её изменяете логикой UI (без разницы XAML или Шарп), но это свойство связанно с данными.
И его изменение влияет на данные.
Такое поведение для UI элемента нарушает саму их концепцию и, следовательно, не допустимо.
Так же состояние UI элемента недолжно иметь "истории".
Оно должно полностью определяться текущими значениями своих публичных членов.

Вторая часть - это визуализация элемента.
Она задаёт отображение элемента во всех его состояниях.
Но ни как не должна влиять на эти состояния.
И XAML создан только для этой части.

Цитата Сообщение от Ray DIceman Посмотреть сообщение
я, может, не прав в своих желаниях прекрасного и идеального
Дело в том. что это как раз таки не "прекрасное и идеальное".
Вы просто плохо знаете ООП, SOLID, теорию построения ООП приложений и многое другое.
Поэтому вам кажется что если бы да кабы, то на Луне парки зацвели...
Вы не видите какие потенциальные проблемы это может создать, и насколько это будет "поперёк горла" проф. программистам.

Цитата Сообщение от Ray DIceman Посмотреть сообщение
Спасибо, что помогли мнре их понять!
Обращайтесь.
Стараюсь всегда и всем разъяснить детально в меру моего понимания.

P.S. Вы покажите свой контрол.
Я его ещё не видел, может там далеко не то, что должно быть.
Не торопитесь.
Вы же учитесь, так лучше сразу учиться правильному стилю программирования.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
22.06.2021, 23:09  [ТС]
Контрол там, в репе. Просто он, почему-то неполностью запушился вначале.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.06.2021, 10:27
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Контрол там, в репе. Просто он, почему-то неполностью запушился вначале.
Посмотрел.

Объясните теперь логику.

Свойства OpeningText, ClosingText, ArrowData и Command - работают только на чтение.
Свойство IsChecked - двунаправленное.

А вот свойство Text - оно что делает?
Почему оно работает на чтение?
Что будет если ему зададут значение которое не соответствует OpeningText или ClosingText?
Опишите как вы представляете логику для этой ситуации.

Второй вопрос.
Если есть свойство Command, то почему нет свойства CommandParameter?

Третий вопрос.
Стрелка у вас это UI элемент.
В частном случае, можно каким-то костылём получить из строки этот UI элемент и то только для одного состояния вверх или вниз.
Намного логичнее если это было не string свойство, а шаблон для Boolean.
Тогда можно было бы задать в нём оба состояния стрелки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2021, 10:27

Понять, почему не срабатывает триггер
Доброго времени суток. Помогите понять почему не отрабатывает триггер, потому что я даже не знаю с чего начать. Триггер стоит на одной...

Неправильно работает триггер
добрый день. помогите понять, в чем ошибка. создаю триггер на автодобавление даты в таблицу (в какой столбец добавлять дату зависит от...

Неправильно работает триггер на удаление и запрет вставки
Здравствуйте! Есть база данных Городской транспорт(на всякий случай прикладываю запрос на ее создание). Пусть известна цена за литр...

Почему смена текста работает только один раз? Что неправильно в коде и почему?
Нужно чтобы при щелчке мыши на поверхности кнопки текст метки Label изменялся на текст окна редактора текста (TextBox). partial class...

Триггер, почему не работает ?
Создал триггер,чтобы ограничить ввод данных в мое поле. Если будет введены значения меньше нуля или больше 100,то должен сработать триггер...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru