0

我有一个 WPF 应用程序,它使用 DevExpress 控件和带有 PRISM 的 MVVM。
我正在使用 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”命令的目的是保存布局,以便以后可以及时恢复。
在 DockItem 停靠或关闭后引发“DockOperationCompleted”事件(还有其他情况,但它们无关紧要)。
问题是,当我关闭主窗口时,我的 DockLayoutManager 中的停靠项会一个一个地关闭,因此每个关闭的停靠项都会调用“SaveLayoutCommand”,我不希望这种情况发生。
引发事件的“DockOperationCompletedEventArgs”有一个“DockOperation”属性,我可以再次检查它,但我不确定这段代码到底应该放在哪里。

:当基于事件的事件参数调用命令时,有没有办法“过滤”?

谢谢:)

4

2 回答 2

3

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

您应该使用他们的 MVVM 库 (PassEventArgsToCommand-Property) 中的 EventToCommand。如果你想让你的视图模型保持 DevExpress 的干净,你可以另外使用转换器将事件参数转换为任意对象。

<dxmvvm:Interaction.Triggers>
    <dxmvvm:EventToCommand Command="{Binding YOURCOMMAND}"
                           EventName="THEEVENT"
                           EventArgsConverter="{StaticResource YOUREVENTARGSCONVERTER}"
                           PassEventArgsToCommand="true" />
</dxmvvm:Interaction.Triggers>
于 2014-04-24T08:05:29.487 回答
1

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

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

MVVM 将 EventArgs 作为命令参数传递

于 2013-03-14T15:42:14.180 回答