在MVVM中绑定事件并将事件参数作为命令参数传递

4

我想将一个事件与ViewModel绑定。

我使用了

clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity

然后我使用了trigger来实现相同的功能。

  <Canvas Grid.Row="2" Grid.Column="2" x:Name="InteractiveCanvas" Style="{StaticResource canvasChartStyle}" ClipToBounds="True" >
        <intr:Interaction.Triggers>
            <intr:EventTrigger EventName="MouseEnter">
                <intr:InvokeCommandAction Command="AppointmentEditing" />
            </intr:EventTrigger>
        </intr:Interaction.Triggers>
    </Canvas>

我需要使用事件参数,但是我无法获取相同的内容。
在WPF中,是否有可能绑定事件并获取事件参数,而不使用MVVM Lite或PRISM?
我只想获取事件参数。

2
使用CommandParameter足够吗? - Belterius
1
通过使用CommandParameter,我们可以将事件参数与CommandParameter绑定。 - Visakh V A
为什么你需要在你的视图模型中使用 EventArgs - Mike Eason
1
@MikeEason 我想获取鼠标位置,是否有其他的替代方法? - Visakh V A
3个回答

6

您可以通过添加以下DLL来完成:

  • System.Windows.Interactivity
  • Microsoft.Expression.Interactions

在XAML中:

使用CallMethodAction类。

使用EventName来调用所需事件;然后在MethodName中指定您的方法名称。

<Window>
    xmlns:wi="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions">

    <wi:Interaction.Triggers>
        <wi:EventTrigger EventName="SelectionChanged">
            <ei:CallMethodAction
                TargetObject="{Binding}"
                MethodName="ShowCustomer"/>
        </wi:EventTrigger>
    </wi:Interaction.Triggers>
</Window>

在你的ViewModel代码中:
public void ShowCustomer()
//The method must be public & can take 0 parameters or 2 parameters i.e.
//object sender & EventArgs args
{
    // Do something.
}

注:这是对问题的真实晚回复,但我希望它能帮到你。


这可以在不需要添加其他库来获取事件参数的情况下工作。 - hfann
@hfann:我可以问一下怎么做吗?因为Interaction.Triggers、EventTrigger和CallMethodAction都是前面提到的程序集的一部分。 - Ankit
当我提到库时,我的意思是MVVMLight或Prism。我已经在使用System.Windows.Interactivityu DLL了。 - hfann
这实际上意味着需要使用上述的 DLL。 - Ankit

1

看看MVVM-Light框架。他们的EventToCommand实现包括PassEventArgsToCommand选项。

有关详细信息,请参见Laurent Bugnion的this questionthis old blog post


我不能在这里使用任何框架,你能提出任何纯WPF的想法吗? - Visakh V A
使用框架有什么问题?为什么要重新发明轮子?我能提出的最好建议是下载MVVMLight源代码,并将相关类(EventToCommand.cs)复制到你自己的库中 - https://mvvmlight.codeplex.com/SourceControl/latest - Peregrine
@VisakhVA 是的,使用 PassEventArgsToCommand="True",你必须稍微修改一下你的命令。 - user5447154

1
使用CommandParameter..就是这样 :)
<Canvas Grid.Row="2" Grid.Column="2" x:Name="InteractiveCanvas" Style="{StaticResource canvasChartStyle}" ClipToBounds="True" >
        <intr:Interaction.Triggers>
            <intr:EventTrigger EventName="MouseEnter">
                <intr:InvokeCommandAction Command="{Binding AppointmentEditing}" CommandParameter="YourParameters" />
            </intr:EventTrigger>
        </intr:Interaction.Triggers>
    </Canvas>

5
我们如何将MouseEventArgs作为参数传递? - Visakh V A
请查看https://dev59.com/CW025IYBdhLWcg3wHSGn。这应该会有所帮助。 - Thierry

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