WPF MVVM事件到命令-基于事件参数调用命令

本文关键字:事件 命令 参数 调用 MVVM WPF 于事件 | 更新日期: 2023-09-27 18:03:59

我有一个使用DevExpress控件和MVVM与PRISM的WPF应用程序。
我正在使用DockLayoutManager的'DockOperationCompleted'事件来调用我的视图模型上的命令,如下所示:

    <dxd:DockLayoutManager x:Name="dockContainer">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="DockOperationCompleted">
                <i:InvokeCommandAction Command="{Binding DataContext.SaveLayoutCommand, ElementName=dockContainer}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <dxd:LayoutGroup/>
    </dxd:DockLayoutManager>

'SaveLayoutCommand'命令的目的是保存布局,以便以后可以恢复。
'DockOperationCompleted'事件在DockItem被停靠或关闭后引发(还有其他情况,但它们无关紧要)。
问题是,当我关闭主窗口时,我的DockLayoutManager中的dock项目正在逐一关闭,因此'SaveLayoutCommand'为每个关闭的dock项目调用,我不希望这种情况发生。
事件引发的'DockOperationCompletedEventArgs'有一个'DockOperation'属性,我可以再次检查,但我不确定这段代码应该适合在哪里。
我想要实现的是,命令应该只在一种情况下调用-当项目停靠
我的问题是:当命令根据事件的事件参数调用时,是否有一种方法可以"过滤"?

:)

WPF MVVM事件到命令-基于事件参数调用命令

除了aKzenTs的答案之外,我想指出的是,使用DevExpress将事件参数传递给命令相当容易。

你应该使用MVVM库中的EventToCommand (passevenargstocommand - property)。如果你想保持你的视图模型干净的DevExpress,你可以另外使用一个转换器来转换事件参数到一个任意对象。

<dxmvvm:Interaction.Triggers>
    <dxmvvm:EventToCommand Command="{Binding YOURCOMMAND}"
                           EventName="THEEVENT"
                           EventArgsConverter="{StaticResource YOUREVENTARGSCONVERTER}"
                           PassEventArgsToCommand="true" />
</dxmvvm:Interaction.Triggers>

没有内置的方法来过滤在调用操作之前引发的事件。但是,您可以实现自己的自定义触发器操作来执行过滤。

不幸的是,访问事件参数并将它们传递给命令也不容易。把这个问题作为参考:

MVVM将EventArgs作为命令参数传递