【问题标题】:Bind event in MVVM and pass event arguments as command parameter在 MVVM 中绑定事件并将事件参数作为命令参数传递
【发布时间】:2017-02-27 12:31:49
【问题描述】:

我想用 ViewModel 绑定一个事件。

我用过

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

我也用了触发器

  <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。

我只想获取事件参数

【问题讨论】:

  • 使用CommandParameter就够了吗?
  • 与CommandParameter,我们如何绑定事件参数与CommandParameter
  • 为什么需要在视图模型中使用EventArgs
  • @MikeEason 我想获得鼠标位置,是否有任何替代方法?

标签: c# .net wpf mvvm


【解决方案1】:

您可以通过添加 DLL 来做到这一点:

  • System.Windows.Interactivitiy
  • Microsoft.Expression.Interactions

在您的 XAML 中:

使用 CallMethodAction 类。

使用EventName 调用您想要的事件;然后在MethodName 中指定您的Method 名称。

<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.
}

P.S:这是对这个问题的真正迟到的回答,但我希望它对你有所帮助。

【讨论】:

  • 这不需要添加另一个库来获取事件参数。
  • @hfann:请问怎么做?因为 Interaction.Triggers、EventTrigger 和 CallMethodAction 是上述程序集的一部分。
  • 当我提到 libaray 时,我指的是 MVVMLight 或 Prism。我已经在使用 System.Windows.Interactivityu DLL。
  • 这实际上意味着需要使用上面提到的 DLL。
【解决方案2】:

应该使用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>

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 我不能在这里使用任何框架,您是否可以提出任何纯 WPF 想法?
  • 使用框架有什么问题?为什么要重新发明轮子?我能建议的最好方法是下载 MVVMLight 源代码并将相关类 (EventToCommand.cs) 复制到您自己的库中 - mvvmlight.codeplex.com/SourceControl/latest
  • @VisakhVA 是的,使用 PassEventArgsToCommand="True",那么你必须稍微改变一下你的命令。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2017-02-05
  • 2014-11-06
相关资源
最近更新 更多