Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Более двух команд на контрол - как?  [new]
user7320
Member

Откуда:
Сообщений: 3543
WPF, MVVM.

На самом деле у меня несколько вопросов.

1. Во-первых, по какому событию запускается команда на, скажем, кнопке? Когды я пишу обработчики событий, то могу сам выбрать события и какой код в них писать. А команда просто привязывается к кнопке и всё. Как и когда она должна выполниться - кто знает.

2. Ну, допустим я выяснил, что по клику команда срабатывает. А может, я хочу, чтобы команды выполнилась при проведении мышью над кнопкой (OnMouseOver или что-то такое)? Что тогда делать?

3. Я захотел большего - хочу по правому клику одну команду, а по левому - другую. Что делать? Я читал, что можно в code behind обработать события и вызывать в них нужные команды. Но это какой-то грязный хак MVVM. Есть способы поприличнее?
15 июл 13, 15:26    [14568226]     Ответить | Цитировать Сообщить модератору
 Re: Более двух команд на контрол - как?  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
user7320
WPF, MVVM.

На самом деле у меня несколько вопросов.

1. Во-первых, по какому событию запускается команда на, скажем, кнопке? Когды я пишу обработчики событий, то могу сам выбрать события и какой код в них писать. А команда просто привязывается к кнопке и всё. Как и когда она должна выполниться - кто знает.
У всех контролов по разному. Надо смотреть мануал по контролу исходники рефлектором.

user7320
2. Ну, допустим я выяснил, что по клику команда срабатывает. А может, я хочу, чтобы команды выполнилась при проведении мышью над кнопкой (OnMouseOver или что-то такое)? Что тогда делать?
MVVM Event To Command => google. Вот одно из решений через Expression Blend SDK.

user7320
3. Я захотел большего - хочу по правому клику одну команду, а по левому - другую. Что делать?
Там EventArgs может передаваться как parameter в ICommand, если хочешь разную реакцию на одно событие.

user7320
Я читал, что можно в code behind обработать события и вызывать в них нужные команды. Но это какой-то грязный хак MVVM. Есть способы поприличнее?
Тут надо определиться, что хочется именно этого. А то может оказаться, что тупо подписаться на событие проще. У обоих подходов есть свои плюсы и минусы. Не надо с фанатизмом подгонять всё под MVVM.
15 июл 13, 15:54    [14568492]     Ответить | Цитировать Сообщить модератору
 Re: Более двух команд на контрол - как?  [new]
user7320
Member

Откуда:
Сообщений: 3543
Алексей К,

Я тут нагуглил про разные поведения (behaviors: 1, 2). Они, судя по вашей ссылке, похожи на ваши Event To Command. Может, это одно и то же?

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

Я тут также поискал и нашёл всякие реализации, которые все роднят некоторые вещи: 1) все они основаны на DependencyProperty, 2) во всех них упоминаются поведения (behaviors), 3) все они достаточно стары (самое новое, что нашёл - 2010 год). Например, вот такое. Там можно передавать на каждое событие свою команду и свой параметр для этой команды. Этакий мультикомманд байндинг. Не могли бы вы посмотреть и сказать, какой вариант лучше - ваш через Event To Command (я так понимаю, это и есть поведения в Expression Blend SDK), или приведённый мной пример через написание специального прикреплённого свойства? В принципе, мне даже кажется, что подходы где-то одинаковые.

И ещё скажите, пожалуйста, этот Expression Blend SDK - это что-то официальное, как .NET Framework, или слабопротестировання написанная кем-то библиотека? Почему это не входит в основной фреймворк? С Prism, кстати, аналогичная ситуация - там много полезных штук, но в основной фреймворк их библиотеки не входят.
15 июл 13, 16:31    [14568811]     Ответить | Цитировать Сообщить модератору
 Re: Более двух команд на контрол - как?  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
user7320

Тут пример того что я предлагал.

<Grid>
   <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseRightButtonDown">
     <i:InvokeCommandAction Command="{Binding TextInputUpdateCommand}"/>
    </i:EventTrigger>
   </i:Interaction.Triggers>


Решение нормальное, меня устраивает.

зы: InvokeCommandAction - это аналог моего класса, на который я дал ссылку ранее. Вроде как он есть "в коробке", но в другой сборке. Не хотел её тащить в проект ради одного класса. :-)
15 июл 13, 17:02    [14569164]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить