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

Триггер не срабатывает на изменение свойства

19.12.2021, 11:41. Показов 1605. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я новичок в WPF, подскажите, что делаю не так?
Есть элемент (Ellipse), который имеет 2 триггера, срабатывающие на изменение bool переменной (flag). В зависимости от значения изменяется фоновое изображение эллипса, вот код:
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
<Ellipse 
            x:Name="DarkModeButton"
            Margin="601,298,249,352" 
            Cursor="Hand"
            Width="50"
            Height="50"
            >
            <Ellipse.Style>
                <Style TargetType="{x:Type Ellipse}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding flag, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="true">
                            <DataTrigger.Setters>
                                <Setter Property="Fill">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Icons/save_dark.png"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger.Setters>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding flag, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="false">
                            <DataTrigger.Setters>
                                <Setter Property="Fill">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Icons/save_white.png"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Ellipse.Style>
        </Ellipse>
C#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public partial class MainWindow : Window
    {
        public bool flag { get; set; }
 
        public MainWindow()
        {
            InitializeComponent();
            // flag = true;  Если изменить здесь при старте программы, то всё работает корректно
        }
 
 
        private void DarkModeBorder_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            flag = !flag;
            MessageBox.Show(flag.ToString());
        }
    }
Если изменить переменную flag в методе Main, то всё работает корректно при запуске программы, но если переменную изменять в ходе выполнения программы по нажатию кнопки, то сама переменная меняется, а триггер не срабатывает
Заранее всем спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2021, 11:41
Ответы с готовыми решениями:

Не срабатывает триггер
Здравствуйте, я недавно столкнулся с проблемой. Триггер не срабатывает весь интернет облазил. Все верно, и галочка на триггер стоит, и...

Не срабатывает RS-триггер
Доброго дня. Имеется задача, симитировать сигнал заданный по рисунку (цикл до 150 мс.) Составил уравнения переключения обоих...

Не срабатывает триггер
Доброго времени суток. Написал триггер, который должен выполнять удаление всех номеров телефона из другой таблицы ,которые относятся к...

2
1337 / 917 / 264
Регистрация: 08.08.2014
Сообщений: 2,756
19.12.2021, 11:45
Sibia54
View (XAML) не сможет узнать об изменении свойства, если его об этом не уведомить.

В WPF для этих целей используется реализация интерфейса 'INotifyPropertyChanged' (System.ComponentModel).

Можно написать свою реализацию или взять какую-нибудь готовую.

https://docs.microsoft.com/en-... ew=net-6.0
https://metanit.com/sharp/wpf/11.2.php
2
0 / 0 / 1
Регистрация: 31.01.2020
Сообщений: 21
19.12.2021, 13:45  [ТС]
Спасибо!
Вот решение, если кому надо:

XML
1
2
3
<Window.Resources>
        <local:Theme x:Key="theme" DarkTheme="True"/>
</Window.Resources>
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
<Ellipse 
            x:Name="ui"
            Margin="601,298,249,352" 
            Cursor="Hand"
            Width="50"
            Height="50">
            <Ellipse.Style>
                <Style TargetType="{x:Type Ellipse}">
                    <Style.Triggers>
                        <!--Здесь мы подписываемся на изменение значения DarkTheme. Вызывается из кода C#-->
                        <DataTrigger Binding="{Binding DarkTheme}" Value="true">
                            <DataTrigger.Setters>
                                <Setter Property="Fill">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Icons/save_dark.png"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger.Setters>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding DarkTheme}" Value="false">
                            <DataTrigger.Setters>
                                <Setter Property="Fill">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Icons/save_white.png"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Ellipse.Style>
</Ellipse>
Дополнительные пространства имен:
C#
1
2
using System.ComponentModel;
using System.Runtime.CompilerServices;
Класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Theme : INotifyPropertyChanged
    {
        private bool darktheme;
 
        public bool DarkTheme
        {
            get { return darktheme; }
            set
            {
                darktheme = value;
                OnPropertyChanged("DarkTheme");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
Вызывающий метод:
C#
1
2
3
4
5
private void DarkTheme_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Theme phone = (Theme)this.Resources["theme"];
            phone.DarkTheme = !phone.DarkTheme; // Меняем с Google на LG
        }
Добавлено через 1 час 2 минуты
Чтобы работало корректно со всеми элементами, изменил триггер вот так:
XML
1
<DataTrigger Binding="{Binding DarkTheme, Source={StaticResource theme}}" Value="true">
(Строки 11 и 20)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2021, 13:45
Помогаю со студенческими работами здесь

Как отследить изменение конкретного свойства объекта, например в ChildVM свойства Title?
Тема создана разделением основной темы https://www.cyberforum.ru/wpf-silverlight/thread2868017.html Элд Хасп, как отследить изменение...

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

MySql триггер не срабатывает из приложения
Всем доброго! Вопрос связан с использованием SQLDb. Создаю из приложения на Lazarus триггер на UPDATE записи в БД, он там что-то...

Параметры SqlBulkCopyOptions: не срабатывает триггер
Есть проект написанный на C# Visual studio 2012. Он подключен к MSSQL SERVER 2008. В БД в таблице есть триггер. В самой системе СУБД...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru