WPF通过事件调用命令

47

在WPF中,是否可以通过事件调用命令?

我有一个保存按钮,当按下它时会调用一个命令,在编辑文本框后完成时会按下这个按钮,还会将一个对象作为命令参数传递。

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

我理想中希望做的是,在文本框失去焦点时调用该命令并将对象作为参数传递,而不是必须按下按钮,类似于:

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

是否有一种方法可以在不使用代码后台的情况下,仍然将对象作为参数传递。因为我正在使用MVVM模式。

谢谢您的时间

4个回答

83

最简单的方法是使用交互触发器:

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

1
这太棒了。非常感谢提供的信息。 - Magus
1
Expression Blend SDK for WPF: https://www.nuget.org/packages/Expression.Blend.Sdk.WPF - Alex Hope O'Connor
1
这个能传递事件参数吗? - Daniel Möller
1
@DanielMöller 是的。添加一个CommandParameter属性。 - Trevor Tubbs

16

您可以使用附加行为来实现此目的。 Marlon Grech编写了Attached Command Behaviors库,以帮助您省去麻烦。使用方法如下:

<Grid>
    <local:CommandBehaviorCollection.Behaviors>
        <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/>
    </local:CommandBehaviorCollection.Behaviors>
</Grid>

3
很抱歉,我不认为您想做的事情是可能的。命令不是委托,所以您不能将命令编写为事件。我认为您最好的选择是处理 Button.LostFocus 事件,然后从处理程序中手动执行命令。
在使用MVVM时,在代码后台放置代码没有任何问题,只是最好将其最小化,并将代码保留在与视图相关的任务中。我认为这段代码与视图相关,因此可以将代码放在代码后台。

1
最终,其他答案清楚地表明这是可能的(虽然不是非常直接)。 - SRKX

2
<Grid MouseRightButtonDown ="{eb:EventBinding Command=SomeCommand, CommandParameter=$e}">

</Grid>

命令

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

{eb:EventBinding Command=CommandName}

命令参数

$e (EventAgrs) 

$this or $this.Property

string

https://github.com/JonghoL/EventBindingMarkup


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接