命令的WPF MVVM事件 - 基于事件args调用命令

时间:2013-03-14 14:27:04

标签: c# wpf mvvm devexpress prism

我有一个WPF应用程序,它使用DevExpress控件和MVVM与PRISM。
我正在使用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'属性,我可以再次检查,但我不确定这个代码到底应该在哪里。
我想要实现的是,只有在一种情况下 - 当项目停靠时,才应该调用该命令
我的问题是:根据事件的事件参数调用命令时,有没有办法“过滤”?

谢谢:)

2 个答案:

答案 0 :(得分:3)

除了aKzenTs的答案,我想指出,使用DevExpress很容易将事件args传递给命令。

您应该使用其MVVM库中的EventToCommand(PassEventArgsToCommand-Property)。如果你想让你的viewmodel保持清洁DevExpress,你还可以使用Converter将事件args转换为任意对象。

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

答案 1 :(得分:1)

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

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

MVVM Passing EventArgs As Command Parameter