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

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

20.06.2021, 11:27. Показов 6375. Ответов 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
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 11:51
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Если без него, то так:
local:MyToggleButton... - это присоединённые свойства?
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 11:54  [ТС]
да. Свойства зависимости
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 12:07
Ray DIceman, открыл реп.
Вы вообще неправильно подошли к реализации.
Вам нужен не UserControl (Пользовательский элемент управления), а Custom Control (Настраиваемый элемент управления).

Основная функция UserControl - это представление данных поступающих из Контекста Данных. Такая же как у Окна.
Основное использование : представление регионов Окна и данных для представления которых не хватает возможностей Шаблона Данных.
Вы же в XAML? совершенно не обращаетесь к контексту данных и, следовательно, вам не нужен UserControl.
Ну, или вы его очень криво реализовали.


Лучше для начала расскажите что вы хотели реализовать обычными словами.
Не КАК ХОТЕЛИ, а именно ЧТО ХОТЕЛИ,

Добавлено через 3 минуты
Цитата Сообщение от Ray DIceman Посмотреть сообщение
да. Свойства зависимости
Разницу между свойствами зависимости (DependecyProperty) и присоединёнными свойствами (AttachedProperty) знаете?
Так как вы обращаетесь к ним типично для присоединённых.
А для DP свойств лучше сначала объявить CustomControl.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 12:12  [ТС]
>>ЧТО ХОТЕЛИ
Это просто.Хотел ToggleButton с двумя состояниями текста в себе. фактически, на этом этапе достаточно.
Но вопрос не в том, правильно ли выбран метод. Охотно верю, что написал чушь. Только почему эта чушь работает неравильно?..
Вы хотите сказать, что этот же триггер, допустим, в CustomControl будет работать как надо?..
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 12:12
Ray DIceman, чё-то у меня закралось впечатление, что вы хотите реализовать Expander.
Знаете о таком элементе?
Чем реализуемое вами должно о него отличаться?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 12:12
Ray DIceman, чё-то у меня закралось впечатление, что вы хотите реализовать Expander.
Знаете о таком элементе?
Чем реализуемое вами должно от него отличаться?
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 12:16  [ТС]
Допустим, что ничем не отличается, ничего дополнительного не надо. Хорошо, попытаю customControl, Спасибо!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 12:35
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Хорошо, попытаю customControl
В данном случае, на мой взгляд, это излишне.
Лучше задать Expander нужный вам шаблон.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 12:38  [ТС]
А есть предположение, почему не работает правильно, и что конкретно изменить, чтоб заработало? :-)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 13:31
Лучший ответ Сообщение было отмечено Ray DIceman как решение

Решение

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

Добавлено через 1 минуту
Список приоритета настройки свойств зависимости
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 13:55
Лучший ответ Сообщение было отмечено Ray DIceman как решение

Решение

Цитата Сообщение от Ray DIceman Посмотреть сообщение
что конкретно изменить
Вот изменил, чтобы работало.
Но логика несколько идиотская получается.
Как минимум надо добавить свойство для стрелки в открытом состоянии.
А то получается в закрытом форма стрелки берётся из свойства.
А в открытом задана жёстко в XAML.
И тип свойства стрелки надо поменять на Geometry.

Добавлено через 16 секунд
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<UserControl
    x:Class="testTriggerWpf.Controls.MyToggleButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:testTriggerWpf.Controls"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Name="uc"
    mc:Ignorable="d">
    <Grid>
        <ToggleButton
            x:Name="toggle"
            Command="{Binding ElementName=uc, Path=Command}"
            IsChecked="{Binding ElementName=uc, Path=IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
            <ToggleButton.Content>
                <Grid>
                    <Grid.RowDefinitions />
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Viewbox
                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        Grid.Row="0"
                        Grid.Column="0">
                        <Grid>
                            <Grid
                                Name="backgroundGrid1"
                                Width="48"
                                Height="48"
                                Visibility="Visible">
                                <Rectangle
                                    Name="Rect"
                                    Fill="{x:Null}"
                                    Visibility="Visible" />
                            </Grid>
                            <Path
                                Width="26"
                                Height="26"
                                Margin="0,0,0,0"
                                Fill="#FF000000"
                                RenderTransformOrigin="0.5,0.5"
                                Stretch="Uniform">
                                <Path.RenderTransform>
                                    <TransformGroup>
                                        <TransformGroup.Children>
                                            <RotateTransform Angle="0" />
                                            <ScaleTransform ScaleX="1" ScaleY="1" />
                                        </TransformGroup.Children>
                                    </TransformGroup>
                                </Path.RenderTransform>
                                <FrameworkElement.Style>
                                    <Style TargetType="Path">
                                        <Setter Property="Data" Value="{Binding ElementName=uc, Path=ArrowData, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                                        <Setter Property="local:MyToggleButton.Text" Value="{Binding ElementName=uc, Path=OpeningText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding IsChecked, ElementName=uc}" Value="True">
                                                <Setter Property="Data" Value="M16,0L32,19.745 0,19.745z" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </FrameworkElement.Style>
 
                            </Path>
                        </Grid>
                    </Viewbox>
                    <TextBlock
                        Grid.Row="0"
                        Grid.Column="1"
                        Margin="5"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Center">
                            <FrameworkElement.Style>
                                <Style TargetType="TextBlock">
                                    <Setter Property="Text" Value="{Binding OpeningText, ElementName=uc}"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsChecked, ElementName=uc}" Value="True">
                                            <Setter Property="Text" Value="{Binding ClosingText, ElementName=uc}" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </FrameworkElement.Style>
 
                    </TextBlock>
                </Grid>
            </ToggleButton.Content>
        </ToggleButton>
    </Grid>
</UserControl>
Добавлено через 1 минуту
Триггерами менять внутренние элементы можно только внутри Шаблона.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 13:55  [ТС]
если вместо
XML
1
<Setter Property="local:MyToggleButton.Text" Value="{Binding ElementName=uc, Path=ClosingText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
написать
XML
1
<Setter Property="local:MyToggleButton.Text" Value="Новый текст" />
, То всё работает, как из пушки. Чисто академический интерес, почему чтение из DP даёт пустую строку в триггере. Я уже и создаю контрол с уже заданным значением. не помогает. где-то в какой-то мелочи я туплю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 13:58
А триггерами в стиле можно менять только свойства элемента который применяет этот стиль.

Добавлено через 1 минуту
Цитата Сообщение от Ray DIceman Посмотреть сообщение
Чисто академический интерес, почему...
Не там ищите.
Я же объяснил выше.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 14:24  [ТС]
Спасибо большое.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 15:08
Ray DIceman, для вас это было просто с целью обучения или стоит какая-то реальная задача?
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 16:42  [ТС]
Задача. Но её поставил я сам.

Добавлено через 1 час 31 минуту
Не, ну пустая строка присваивается же. почему с ней получается, а своё же DP нет... бардак.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 16:58
Цитата Сообщение от Ray DIceman Посмотреть сообщение
а своё же DP нет... бардак.
Вы не можете одному и тому же свойству присвоить два разных значения.
Присмотритесь по вашей логике.
Вы именно и пытаетесь это сделать.
Свойство можно присвоить либо обычным присвоением, что вы делаете в конструкторе.
Либо сеттером в стиле.
Если есть обычное присвоение, то сеттер игнорируется.
0
0 / 0 / 0
Регистрация: 30.03.2020
Сообщений: 28
20.06.2021, 17:01  [ТС]
А пустое значение присвоить получается, если в триггере поменять ветки, то тоже работает наполовину. Только на другую...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
20.06.2021, 17:09
Ray DIceman, не надо ломать голову как сделать НЕПРАВИЛЬНО.

Любое решение задачи начинается в первую очередь с выбора правильного способа её решения с учётом имеющихся инструментов.
А не наоборот: "я хочу её решить этим инструментам, но не тем способом для чего он предназначен".

Добавлено через 9 секунд
Если свойство предназначено для получения ВНЕШНИХ данных, то в принципе не надо задавать ему сеттер в стиле.
А почему одно кривое решение работает наполовину, а другое вовсе не работает - зачем в этом копаться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2021, 17:09
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru