如何将WPF ICommand表示为一个与UI松散耦合的简单字符串?

时间:2011-04-10 08:48:58

标签: c# .net wpf cab prism

在过去使用Windows窗体时,我都使用Composite UI Application Block的部分结合一些集中式命令处理和安全规则来实现一种松散耦合的MVC方法来接口命令执行绑定。我想知道如何使用ICommandRoutedCommand在WPF中执行此操作?

我之前的实施包括以下内容:

  1. 将每个命令与基于REST的URI形式的字符串相关联,例如cmd:// myapp / orders / create
  2. 编写一个自定义ICommand(不要与WPF混淆),它将处理命令执行,它只有Execute()方法,CanExecute属性以及{{1}如果它支持撤消功能,则为“CanUndo”。
  3. 然后,松散地绑定执行命令所需的接口对象
    1. 处理Undo()事件,该事件不知道要执行哪个命令,只是传递集中的Click命令名来执行。
    2. CommandManager收到命令后,只需使用Composite UI Application Block中的多对多功能来提升命令事件。
    3. 在实际执行命令之前,命令管理器执行安全检查,如果登录用户可以执行命令字符串,安全规则通过XML文件加载并由模式组成,则基本上会对我的CommandManager进行检查。 as'cmd:// myapp / finance / *'
    4. 一旦在接收命令上引发命令事件,它就会负责通过基于视图模型的依赖关系来确定状态和上下文。
  4. 我喜欢这种方法,因为它易于编写,松散耦合,并且只允许命令通过DI通过视图模型获得接口状态。 Composite UI Application Block也让我很容易“启用/禁用/不可用”

    我可以类似地复制除了命令的'字符串'表示之外的几乎所有内容,这是至关重要的,因为我们编写的安全上下文可以通过处理SecurityManager等命令模式来锁定整个部分,我们也可以然后让用户决定他们的命令快捷方式绑定等。

    对我来说,关键要求是:

    1. 命令需要表示为字符串,这是绝对要求。
    2. 必须能够声明命令字符串是“启用”,“禁用”和“不可用”(意味着它应隐藏在UI中。
    3. 接口元素必须不知道如何处理命令,或者如何提供上下文,这是命令责任本身通过它发现的视图模型对象。
    4. 命令执行必须是集中的,即我需要一个命令管理器对象来处理引发事件以执行命令执行以及维护撤销堆栈。
    5. 编辑:我刚刚考虑过如何通过使用MEF导出提供命令绑定来公开提供命令名称的自定义元数据,然后ImportMany可以在我的{{1}中加载它们,现在只是

      的问题
      1. 告诉他们调用的接口项cmd://myapp/finance/*,并且<; li>
      2. 允许命令字符串更改状态(启用/禁用/不可用)。
      3. 编辑2 :我考虑过一个解决方案,我的CommandManager接受一个Command String方法,其中一个人可以用命令字符串注册一个控件,然后命令管理器可以当UI元素的状态发生变化并将事件绑定到它们时,处理UI元素的启用/禁用/隐藏,这提供了更大的灵活性和解耦,同时还为用户定制(移动菜单,按钮配置,键盘快捷键等)。这引起了一个担忧,虽然我没有使用WPF提供的CommandManager设施的单点,但最终我觉得不重要,但我想知道指挥设施是否提供了WPF可以像我定义的那样简单地使用。另一个优点是此方法不是WPF特定的,可以在任何地方使用。

1 个答案:

答案 0 :(得分:0)

在我看来,你正在弯曲自己以适应你曾经在winform中使用的模式,以便在wpf中使用。这通常不是最好的方法。

但具体针对你的问题我只是想说:如果你完全跳过ICommand,你肯定会在幕后松散wpf。例如:ICommands CanExecute方法。 WPFs命令管理器根据用户对应用程序的输入重新查询该方法。否则你必须自己处理“启用”/“禁用”/“不可用” - 状态更改的传播,并实现自己的逻辑来启用/禁用按钮。

此外,命令不仅可用于Click事件。

和last:命令可以在没有WPF的情况下执行 - 它只是一个接口而没有明确绑定到wpf