WPF вызывает команды через события - PullRequest
34 голосов
/ 26 июня 2009

Можно ли вызвать команду через событие в WPF?

У меня есть кнопка сохранения, которая при нажатии вызывает команду, она нажимается после завершения редактирования текстового поля и также передает объект в качестве параметра команды

 <Button Content="Save"  Command="{Binding DataContext.SaveQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}" />

В идеале я бы хотел вызвать эту команду и передать объект в качестве параметра, когда текстовое поле теряет фокус, а не нажимать кнопку, например:

 <Button LostFocus="{Binding SaveQueueTimeCommand}" />

И все же как-то передать объект в качестве параметра. Есть ли способ добиться этого без использования кода, как я использую шаблон MVVM

Спасибо за ваше время

Ответы [ 4 ]

65 голосов
/ 21 февраля 2014

Самый простой способ сделать это - использовать триггер взаимодействия.

<Grid xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SomeEvent">
            <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Grid>

Я добавил это ради потомков.

15 голосов
/ 26 июня 2009

Вы можете использовать прикрепленное поведение для достижения этой цели. Марлон Греч написал библиотеку Attached Command Behaviors , чтобы избавить вас от хлопот. Использование выглядит так:

<Grid>
    <local:CommandBehaviorCollection.Behaviors>
        <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/>
    </local:CommandBehaviorCollection.Behaviors>
</Grid>
3 голосов
/ 20 ноября 2014
<Grid MouseRightButtonDown ="{eb:EventBinding Command=SomeCommand, CommandParameter=$e}">

</Grid>

Команда

{eb:EventBinding} (Simple naming pattern to find Command)

{eb:EventBinding Command=CommandName}

CommandParameter

$e (EventAgrs) 

$this or $this.Property

string

https://github.com/JonghoL/EventBindingMarkup

3 голосов
/ 26 июня 2009

Боюсь, я не думаю, что вы хотите сделать, возможно. Команды не являются делегатами, поэтому вы не можете написать команду до события. Я думаю, что ваш лучший вариант - обработать событие Button.LostFocus, а затем вручную выполнить команду из обработчика.

Нет ничего плохого в том, чтобы поместить код в код позади при использовании MVVM, лучше всего свести его к минимуму и оставить код для просмотра только связанных задач. Я бы назвал это представление кода связанным, так что было бы найдено поместить код в код позади.

...