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'属性,我可以再次检查,但我不确定这段代码应该适合在哪里。
我想要实现的是,命令应该只在一种情况下调用-当项目停靠
我的问题是:当命令根据事件的事件参数调用时,是否有一种方法可以"过滤"?
:)
除了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作为命令参数传递