EventToCommand 和 CommandManagerBinding 不起作用
Posted
技术标签:
【中文标题】EventToCommand 和 CommandManagerBinding 不起作用【英文标题】:EventToCommand and CommandManagerBinding not working 【发布时间】:2017-06-21 07:51:11 【问题描述】:我有一个 ViewModel,其中包含一个通过 CommandManager
向其他视图公开的命令。
现在,如果我双击 TreeView
(https://catelproject.atlassian.net/wiki/display/CTL/EventToCommand) 的项目,我想使用 EventToCommand
来触发命令。
不幸的是,如果我使用catel:CommandManagerBinding
,则不会触发命令,普通的Binding
对视图的 ViewModel 的命令工作正常。但我需要绑定到另一个 ViewModel 的命令。
提前致谢
【问题讨论】:
你能在没有 EventToCommand 的情况下使用 CommandManagerBinding 吗?换句话说,你确定你的命令被正确注册了吗? 是的,我正在将命令用于执行完全相同的 MenuItem。它在 MenuItem 上运行良好。 能否请您创建一个小型复制品,以便在 Catel v5 中修复?它应该可以工作,因为 CommandManagerBinding 只是一个全局的东西。 我创建了一个带有此错误 github.com/HumpaLumpa007/EventToCommand.CommandManagerBinding 的测试项目。我也会在 github 项目页面上创建一个 issue 【参考方案1】:使用 InvokeCommandAction 怎么样?
【讨论】:
【参考方案2】:我已经回复了在问题跟踪器上创建的工单,但也会将回复放在这里的可用性。
请注意,这已经在 Catel v5 上进行了测试,但也应该适用于 v4。
我做了 2 处更改:
1.我在启动时创建命令:
var commandManager = ServiceLocator.Default.ResolveType<ICommandManager>();
commandManager.CreateCommand("AddToCollectionCommand");
然后我在虚拟机中为命令注册一个动作:
commandManager.RegisterCommand("AddToCollectionCommand", AddToCollectionCommand, this);
2.您必须先绑定命令,然后绑定xaml中的命令参数(顺序很重要,虽然不应该,但这是我们无法解决的xaml解析问题):
<!-- now works! -->
<catel:EventToCommand Command="catel:CommandManagerBinding AddToCollectionCommand"
CommandParameter="Binding SelectedDataItem"
DisableAssociatedObjectOnCannotExecute="False" />
我建议您还研究应用程序范围的命令容器。它们非常强大,可以让您分离关注点。您可以在此处找到文档:
http://docs.catelproject.com/vnext/catel-mvvm/commands-events/application-wide-commands
如果您使用 Orchestra(请参阅 https://github.com/wildgums/orchestra),您甚至可以使用现成的 UI 重新映射应用范围内的命令输入手势。
【讨论】:
以上是关于EventToCommand 和 CommandManagerBinding 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
MVVM Light:在 XAML 中添加 EventToCommand 而不使用 Blend、更简单的方法或片段?
MVVMLight EventToCommand导致内存泄漏