1

Всем доброго времени суток! Пытаюсь разобраться с реализацией паттерна MVVM с использованием библиотек от GalaSoft. Застопорился на EventToCommand. Как я прочитал в этой теме данная конструкция используется для реализации обработчиков различных событий контролов через команды. Для проверки написал команду, которая выводит сообщение на экран:

public ICommand SelectGroup
        {
            get
            {
                return new RelayCommand<Object>(ExecuteSelectTagGroupCommand);
            }
        }
public void ExecuteSelectTagGroupCommand(object parameter)
        {
            System.Windows.MessageBox.Show("fdfd");
        }

Вызов данной команды я сделал для события MouseDown текстбокса и для события Closing окна приложения.

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <cmd:EventToCommand Command="{Binding SelectGroup}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>



 <TextBlock Text="{Binding Name}" MouseDown="TextBlock_MouseDown">
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="MouseDown">
                                        <cmd:EventToCommand Command="{Binding SelectGroup}" CommandParameter="{Binding}"/>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </TextBlock>

Однако работает только команда для окна. Причем если подписаться на событие MouseDown для текстбокса, то все работает нормально. В чем может быть причина?

  • Используйте MouseBinding, это боле правильное решение: https://ru.stackoverflow.com/a/888200/218063 – Андрей NOP Jan 25 '19 at 08:53
  • Интересный момент. TextBlock у меня используется в HierarchicalDataTemplate. И вот там команды, даже с использованием MouseBinding, не работают. Но если я вынесу его в отделный самостоятельный элемент - команды отрабатывают. Можно это исправить? – Ivan Kozlov Jan 25 '19 at 09:12
  • 1
    Приведите минимальный самодостаточный пример для воспроизведения. Может у вас там ошибки привязки или еще что... Должно всё работать и в шаблонах: https://ru.stackoverflow.com/a/735522/218063 – Андрей NOP Jan 25 '19 at 09:14
  • Проблема в том, что в приложении используются библиотеки DevExpress и привести все ровно в том же виде не получится. А насчет ошибок привязки, то это крайне маловероятно, потому что данные выводятся корректно, не срабатывает клик мыши по ним. Но точно такой же клик по отдельному текстбоксу работает как надо. – Ivan Kozlov Jan 25 '19 at 09:22
  • @АндрейNOP, собственно данная вещь не работает и с обычным TreeView. Вот ссылка на мою "проблему" https://dropmefiles.com/WTH4z . – Ivan Kozlov Jan 25 '19 at 09:44
  • Ну, как я и говорил у вас проблема с привязкой: https://i.stack.imgur.com/Xvbkd.png Дело в том, что {Binding SelectGroup} это привязка к экземпляру Device, а не к корневой VM. Как вы понимаете, в Device нет свойства SelectGroup – Андрей NOP Jan 25 '19 at 09:55
  • Смотрите в сторону RelativeSource FindAncestor – Андрей NOP Jan 25 '19 at 09:56
  • 1
    В вашем изначальном коде с EventToCommand абсолютно та же проблема, ну и в том топике, на который я вам дал ссылку можно посмотреть как вам добраться до команды: https://ru.stackoverflow.com/a/735522/218063 – Андрей NOP Jan 25 '19 at 10:06
  • именно в этом и была ошибка! Спасибо! – Ivan Kozlov Jan 25 '19 at 11:10

0 Answers0