Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/63: Рейтинг темы: голосов - 63, средняя оценка - 4.95
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329

Предотвратить всплытие выполнения команды привязанной к MouseDoubleClick

27.08.2021, 18:06. Показов 13363. Ответов 99

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста, как предотвратить всплытие выполнения команды по двойному клику от дочернего выделенного объекта до родительского.
Структура следующая, упростил для кратности
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ListBox ItemsSource="{Binding Path=Roots,BindsDirectlyToSource=True}" SelectedItem="{Binding Path=SelectedItemRoot, Mode=TwoWay}" ScrollViewer.CanContentScroll="False">
 <i:Interaction.Triggers>
     <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding SelectedItemRoot.ShowEditDialogCommand}/>
     </i:EventTrigger>
 </i:Interaction.Triggers>
    <ListBox.ItemTemplate> 
         <ListBox ItemsSource="{Binding Path=Children}"  SelectedItem="{Binding Path=SelectedItemChild, Mode=TwoWay}" >
            <i:Interaction.Triggers>
               <i:EventTrigger EventName="MouseDoubleClick">
                   <i:InvokeCommandAction Command="{Binding SelectedItemChild.ShowEditDialogCommand}/>
               </i:EventTrigger>
            </i:Interaction.Triggers>
            <ListBox.ItemTemplate /> 
          </ListBox>
     </ListBox.ItemTemplate>
</ListBox>
При выборе дочернего элемент списка SelectedItemChild, происходит выбор родительского элемента SelectedItemRoot, по скольку тот в нем находится

При двойном клике по ItemChild выполняется команда ItemChild.ShowEditDialogCommand, в которой происходит вызов модального окна предназначенного для редактирования ItemChild.
По закрытию этого модального окна, происходит автоматическое открытие модального окна у родителя ItemRoot.ShowEditDialogCommand - т.е выполняется команда родителя, хотя я не кликал два раза по родителю

Как предотвратить это всплытие выполнения команд ?

Даже скажу так, выполняются все команды выделенных объектов, по очереди, хотя кликал я только по одному
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2021, 18:06
Ответы с готовыми решениями:

WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html На практике часто встречаются случаи когда команда и кнопка...

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd C:\Users\alex_iv\Desktop\test_node\ node...

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

99
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.09.2021, 23:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от UseMuse Посмотреть сообщение
после того,
Этот код не из последней фиксации.
Синхронизируйтесь.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
14.09.2021, 09:23  [ТС]
Элд Хасп, комментарий мой предпоследний касается последних фиксаций
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.09.2021, 18:42
Цитата Сообщение от UseMuse Посмотреть сообщение
комментарий мой предпоследний касается последних фиксаций
У вас логически неверно построена модель.
Вообще, DBHelper очень коряво смотрится в качестве Модели.

data - это сущность отражающая данные Модели.
И у VM нет полномочий на её самостоятельное изменение.
Допустим, нельзя делать data.Title = Title.

Для изменения данных вы должны обратиться к Модели.
Модель производит соответствующие манипуляции и если они успешны, то возвращает сущность отражающую изменённые данные.

Например, вот этот тип DataModelChild лучше сделать иммутабельна DTO.

И примерено такое его использование в VM:
C#
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
using ListBoxTemplateMouseClickCommand.DataModel;
using Simplified;
using System.Windows.Input;
 
namespace ListBoxTemplateMouseClickCommand.ViewModel
{
    public class ViewModelChildEdit : ViewModelBase
    {
        private DataModelChild data;
 
        public void SetData(DataModelChild data)
        {
            this.data = data;
            Id = data?.ID;
            Title = data?.Title;
        }
 
        public DataModelChild GetData() => data;
        public ViewModelChildEdit()
        {
            CloseCommand = new RelayCommand(() =>
            {
                //data.Title = Title;
            });
 
            SaveCommand = new RelayCommand(
                () =>
                {
                    try
                    {
                        SetData(DBHelper.TitleCnahge(data, Title));
                    }
                    catch (System.Exception)
                    {
                        ErrorMessage = "Ошибка сохранения";
                    }
                },
                () => data.Title != Title);
        }
 
        public int? Id { get => _id; private set => Set(ref _id, value); }
 
        private string _title;
        private int? _id;
        private string _errorMessage;
 
        public string Title
        {
            get => _title;
            set => Set(ref _title, value);
        }
 
        public string ErrorMessage { get => _errorMessage; private set => Set(ref _errorMessage, value); }
 
        #region Команды
        public ICommand CloseCommand { get; }
 
        public RelayCommand SaveCommand { get; }
        #endregion
    }
}
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
14.09.2021, 21:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
data - это сущность отражающая данные Модели.
Все что в папке DataModel - это подразумевалось как DTO. Сущности я пропустил в этом проекте, для упрощения первоначального примера.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вообще, DBHelper очень коряво смотрится в качестве Модели.
я бы сказал, что это просто что-то по типу класса репозитория
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.09.2021, 21:15
Цитата Сообщение от UseMuse Посмотреть сообщение
Все что в папке DataModel - это DTO
Я понял.
Но их нужно сделать ИММУТАБЕЛЬНЫМИ.
Тогда вы сами себя перестанете путать с просачиванием несвойственного функционала.

Цитата Сообщение от UseMuse Посмотреть сообщение
я бы сказал, что это просто что-то по типу класса репозитория
Всё с чем не работает непосредственно с View - относится к слою Модели: репозиторий, Бизнес Логика, Службы, Сервисы и др.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
14.09.2021, 21:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
к слою Модели
Говоря про слои и конкретно "слой модели", какая архитектура подразумевается?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.09.2021, 21:22
Цитата Сообщение от UseMuse Посмотреть сообщение
Говоря про слои и конкретно "слой модели", какая архитектура подразумевается?
Любая из MVC, MVP, MVVM - ООП паттерны Приложений.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 09:51  [ТС]
Элд Хасп, мне не ясен момент с тем, где располагать команды. Я могу их все расопложить в ViewModelMain, а могу оставить как есть, как понять где их распологать? По контексту расположения на экране. Или по логике отношения к объекту внутри ViewModel?

Добавлено через 29 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
public void SetData(DataModelChild data)
Зачем метод публичный? он еще где-то должен использоваться?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 10:26
Цитата Сообщение от UseMuse Посмотреть сообщение
мне не ясен момент с тем, где располагать команды. Я могу их все расопложить в ViewModelMain, а могу оставить как есть
Здесь нужно принимать концептуальное решение.
В данный у вас для редактирования создаются отдельные независимые Окна.
Поэтому команды должны быть в их Контексте Данных (ViewModel).
Привязаться к Контексту Данных другого (основного) Окна вы просто не сможете.

НО!
Что такое эти ваши дополнительные Окна?
Это Диалоги.
А Диалог не должен сам производить каких-то действий с Данными.
Он должен только вернуть какое действие нужно совершить.
И если сделать в такой (более верной) концепции, то в диалоге просто не будут нужны команды.

Цитата Сообщение от UseMuse Посмотреть сообщение
Зачем метод публичный? он еще где-то должен использоваться?
Это просто пример.
Чтобы пояснить смысл объясняемого и не вносить больших изменений в текущий код.
Для нормальной реализации понадобятся архитектурные изменения.
А это повлечёт очень значительные изменения во многих типах.

Добавлено через 3 минуты
С публичным методом, создание экземпляра VM и передача ему данных - это отдельные операции.
Что позволяет (в том числе) использовать одни и те же экземпляры VM и View для редактирования разных данных.
Если такое, конечно, нужно.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 12:06  [ТС]
Элд Хасп, был бы весьма благодерн, если бы получилось бы мой проект привести к примерному
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 12:54
Фиксация e1f2c670:
Добавлен триггер события Control.MouseDoubleClick, позволяющий для триггеров обрабатывать отмену его всплывания.
Очищен CodeBehind основного Окна.
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 12:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Фиксация e1f2c670:
Пушка, полезный опыт, спасибо
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 13:04
Цитата Сообщение от UseMuse Посмотреть сообщение
если бы получилось бы мой проект привести к примерному
Добавьте ветку к Репозиторию.
В этой ветке, в первую очередь, реализуйте класс Модели и классы иммутабельных DTO для неё.
Какие нужны члены для Модели:
1) Метод возвращающий все корневые элементы;
2) Метод возвращающий все дочерние элементы;
3) Метод возвращающий все дочерние элементы по Id родительского элемента;
4) Метод возвращающий корневой по его Id;
5) Метод возвращающий дочерний по его Id;
6) Метод изменяющий корневой элемент по его Id и др. параметрам и возвращающий новый корневой элемент;
7) Метод изменяющий дочерний элемент по его Id и др. параметрам и возвращающий новый дочерний элемент.

Как реализуете - напишите.
Я посмотрю.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 13:29  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
классы иммутабельных DTO для неё
может тогда структур ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 14:10
Цитата Сообщение от UseMuse Посмотреть сообщение
может тогда структур ?
Можно.
Я предпочитаю делать классы, так как для иммутабельных можно закрыть конструктор по умолчанию.
Но это не принципиально (насколько вижу) - поэтому на ваше усмотрение.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 14:27  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я предпочитаю делать классы, так как для иммутабельных можно закрыть конструктор по умолчанию.
Я тоже подумал про классы с начало, начал искать примеры реализаций иммутабельных DTO, наткнулся на эту статью и передумал в сторону структур. Интересно ваше мнение по этому поводу
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 14:42
Цитата Сообщение от UseMuse Посмотреть сообщение
Интересно ваше мнение по этому поводу
Есть свои плюсы и минусы.
Есть задачи в которых структуры сложнее использовать.
И мне (для себя) проще каждый раз делать классы, чем выбирать для каждой задачи как лучше и потом путаться при использовании.
В данной задаче это абсолютно безразлично.
Делайте как вам удобнее.

Добавлено через 3 минуты
Мне, кажется, намного нагляднее, если у свойства не будет сеттера, чем помнить, что это структура и хоть есть сеттер он не изменяет значение данных в самом источнике.

Там где проще применить DTO структуру, в современном Шарпе, лучше использовать кортежи.
Они проще, понятнее, прозрачнее.

Добавлено через 1 минуту
В данной задаче, вы тоже можете применить кортежи.
Никакой функциональной нагрузки ваши DTO не несут.
Так что это только облегчит Решение.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 14:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
должны быть в их Контексте Данных
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Он должен только вернуть какое действие нужно совершить.
И если сделать в такой (более верной) концепции, то в диалоге просто не будут нужны команды.
Так и не понял, в ViewModelChildEdit нахождение команд это "есть ок"? или их нужно перестить в ViewModelChild или еще выше
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.09.2021, 14:45
Цитата Сообщение от UseMuse Посмотреть сообщение
Так и не понял, в ViewModelChildEdit нахождение команд это "есть ок"? или их нужно перестить в ViewModelChild или еще выше
Мы же сейчас создаём новую архитектуру.
В ней будут использоваться Диалоги.
А для Диалогов команды не будут нужны.
А без введения Диалогов избавиться от команд не получится.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
15.09.2021, 14:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавьте ветку к Репозиторию.
и в этой ветке править исходный проект или новый начать?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2021, 14:55

Вывести результат выполнения команды HELP в текстовый файл так, чтобы у каждой команды был порядковый номер
Всем привет, нужна помощь! Необходимо команду help вывести в текстовый документ, чтобы у каждой команды был свой порядковый номер. ...

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

Как предотвратить переподключение SignalR-клиента после выполнения ajax-запроса?
Добрый день. Использую SignalR для реалтайм приложения на ASPnet-MVC. В приложении пользователь должен загрузить файл на сервер. ...

Написать команды выполнения
1. Использовать порты F0/8-9 для передачи трафика VoIP 2. Отключите автосогласование на интерфейсах коммутаторов в сторону...

Ограничение выполнения команды
Здравствуйте, выполняю команду на питон, система линукс. Команда слушает mqtt сервер и возвращает прочитанное сообщение. Но когда сервер не...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru