powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / События, контролы, обработчики...
10 сообщений из 10, страница 1 из 1
События, контролы, обработчики...
    #38008241
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь будет длинный пост о событиях и контролах, и в начале будет сильно объемное описание одного очень простого
примера, поэтому лучше наверно сразу смотреть третий абзац снизу, начинающийся на "Вопрос: ...".

Была задача контрол с гридом (RadGridView), который ведет себя определенным образом:
Есть список элементов - имя и булево значение. Нужно редактировать только значение.
При нажатии на CheckBox значения - вывести ChildWindow для редактирования этого значения.
При нажатии в ChildWindow на "ОК" - сохранить изменение, иначе - отменить.

Сначала взять грид, затем определить для него колонку с CheckBox, на CheckBox навешать обработчик (события
checked/unchecked), который обрабатывает клики.
Затем определить класс данных.

Затем возникает проблема №1:
При установке источника данных для грида свойства IsChecked некоторых CheckBox устанавливаются в "true" - это
приводит к поднятию события Checked для каждого из них.
Т.е. в моем случае это два открытых ChildWindow при старте.
Решил следующим образом:
Отвязал обработчики для checked/unchecked из замла и прописал их в коде при загрузке грида:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private void gridView_RowLoaded(object sender, RowLoadedEventArgs e) {
            try {
                var row = e.Row as GridViewRow;
                foreach (var cell in row.Cells.Where(c => c.Column.UniqueName == "IsSet")) {
                    var cb = cell.Content as CheckBox;
                    cb.Checked += ReportBlockCheckBox_Checked;
                    cb.Unchecked += ReportBlockCheckBox_Unchecked;
                }
            } catch {
            }
        }

Затем возникает проблема №2:
При клике на CheckBox его значение меняется, но по требованиям - не должно.
Решил следующим образом:
Вручную отписаться от события, сменить значение на требуемое, подписаться заново.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
private void ReportBlockCheckBox_Checked(object sender, System.Windows.RoutedEventArgs e) {
            try {
                var cb = e.OriginalSource as CheckBox;
                cb.Unchecked -= ReportBlockCheckBox_Unchecked;
                cb.IsChecked = false;
                cb.Unchecked += ReportBlockCheckBox_Unchecked;

                ShowReportBlockChildWindow(sender);
            } catch {
            }
        }

        private void ReportBlockCheckBox_Unchecked(object sender, System.Windows.RoutedEventArgs e) {
            try {
                var cb = e.OriginalSource as CheckBox;
                cb.Checked -= ReportBlockCheckBox_Checked;
                cb.IsChecked = true;
                cb.Checked += ReportBlockCheckBox_Checked;

                ShowReportBlockChildWindow(sender);
            } catch {
            }
        }


Затем возникает проблема №3:
При сохранении значения поднимаются события checked/unchecked и ChildWindow редактирования выводится заново.
Третью проблему решать не стал, но знаю как ее решить.

Применены telerik-компоненты для приближения примера к реальной ситуации.
Обработка исключений намеренно пустая.
Код: https://skydrive.live.com/redir?resid=720EBE42733ED7E3!123&authkey=!AIbFgF2ep2OLak0

Вопрос: как избавиться от этой катавасии с событиями?
Это упрощенный пример реальной ситуации, где нужно было сделать подобный функционал в сжатый срок.
Результат был получен, он удовлетворял требованиям, но его реализация мне не понравилась.
Хотелось бы провести работу над ошибками.

В общем, в начале написания этого кода, казалось, что реализация позже, используя MVVM, решит этот бардак.
Но потом стало ясно, что события генерируемые контролами никуда не денутся и придется решать эти же проблемы,
только во ViewModel, где завязок на View быть не должно.

В чем моя проблема? Как бы решали это Вы?
С одной стороны - можно написать быдлокод один раз и забыть и забить.
С другой стороны - если кому-нибудь или Вам однажды придется разбираться в нем - это очень плохо.
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38008591
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем эти мультики? Добавь button вместо CheckBox c привязкой к нужной команде.
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009136
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вариант.
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009143
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmatic,

Но простой батон не подойдет, нужен с визуальным стилем чекбокса плюс возможность выставить IsChecked только программно.
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009251
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmaticenigmatic,

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

По сути это никакой checkbox, а нарисовать галку при нажатии можно даже на заборе.

ЗЫ Идиотские хотелки нужно посылать в сад
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009282
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗЫ Идиотские хотелки нужно посылать в сад=)
Ситуация такова: сначала была сделана методика тестирования для пользователей, затем реализация. Тех, кто делал методику, я в глаза не видел. Если реализация будет отличаться от методики, то тест, возможно, будет не пройден. Пришел запрос сделать так и так, нужно было делать именно так. Задача была выполнена точно и в срок. :)
ЗЫ. Полностью с Вами согласен.
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009309
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmaticSeVaЗЫ Идиотские хотелки нужно посылать в сад=)
Ситуация такова: сначала была сделана методика тестирования для пользователей, затем реализация. Тех, кто делал методику, я в глаза не видел. Если реализация будет отличаться от методики, то тест, возможно, будет не пройден. Пришел запрос сделать так и так, нужно было делать именно так. Задача была выполнена точно и в срок. :)
ЗЫ. Полностью с Вами согласен.

Проще просто переопределить стили для кнопки, те кто будет тестировать даже не заметят
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009475
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,

Угу :)
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009763
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
enigmaticSeVa,

Угу :)

Ага
...
Рейтинг: 0 / 0
События, контролы, обработчики...
    #38009808
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa Ага Принято :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / События, контролы, обработчики...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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