在过去使用Windows窗体时,我都使用Composite UI Application Block的部分结合一些集中式命令处理和安全规则来实现一种松散耦合的MVC方法来接口命令执行绑定。我想知道如何使用ICommand
或RoutedCommand
在WPF中执行此操作?
我之前的实施包括以下内容:
ICommand
(不要与WPF混淆),它将处理命令执行,它只有Execute()
方法,CanExecute
属性以及{{1}如果它支持撤消功能,则为“CanUndo”。Undo()
事件,该事件不知道要执行哪个命令,只是传递集中的Click
命令名来执行。CommandManager
收到命令后,只需使用Composite UI Application Block中的多对多功能来提升命令事件。CommandManager
进行检查。 as'cmd:// myapp / finance / *'我喜欢这种方法,因为它易于编写,松散耦合,并且只允许命令通过DI通过视图模型获得接口状态。 Composite UI Application Block也让我很容易“启用/禁用/不可用”
我可以类似地复制除了命令的'字符串'表示之外的几乎所有内容,这是至关重要的,因为我们编写的安全上下文可以通过处理SecurityManager
等命令模式来锁定整个部分,我们也可以然后让用户决定他们的命令快捷方式绑定等。
对我来说,关键要求是:
编辑:我刚刚考虑过如何通过使用MEF导出提供命令绑定来公开提供命令名称的自定义元数据,然后ImportMany可以在我的{{1}中加载它们,现在只是
的问题cmd://myapp/finance/*
,并且<; li>
编辑2 :我考虑过一个解决方案,我的CommandManager
接受一个Command String
方法,其中一个人可以用命令字符串注册一个控件,然后命令管理器可以当UI元素的状态发生变化并将事件绑定到它们时,处理UI元素的启用/禁用/隐藏,这提供了更大的灵活性和解耦,同时还为用户定制(移动菜单,按钮配置,键盘快捷键等)。这引起了一个担忧,虽然我没有使用WPF提供的CommandManager
设施的单点,但最终我觉得不重要,但我想知道指挥设施是否提供了WPF可以像我定义的那样简单地使用。另一个优点是此方法不是WPF特定的,可以在任何地方使用。
答案 0 :(得分:0)
在我看来,你正在弯曲自己以适应你曾经在winform中使用的模式,以便在wpf中使用。这通常不是最好的方法。
但具体针对你的问题我只是想说:如果你完全跳过ICommand,你肯定会在幕后松散wpf。例如:ICommands CanExecute方法。 WPFs命令管理器根据用户对应用程序的输入重新查询该方法。否则你必须自己处理“启用”/“禁用”/“不可用” - 状态更改的传播,并实现自己的逻辑来启用/禁用按钮。
此外,命令不仅可用于Click事件。
和last:命令可以在没有WPF的情况下执行 - 它只是一个接口而没有明确绑定到wpf