gpt4 book ai didi

c# - WPF ICommand如何用简单的字符串表示以与UI松散耦合?

转载 作者:太空宇宙 更新时间:2023-11-03 16:46:55 26 4
gpt4 key购买 nike

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

我以前的实现包括以下内容:


将每个命令与基于REST的URI形式的字符串相关联,例如cmd:// myapp / orders / create
编写一个可处理命令执行的自定义ICommand(不要与WPF混淆),它只有一个Execute()方法,以及CanExecute属性以及Undo()和`CanUndo(如果它支持撤消功能)。
然后,执行命令所需的接口对象将被松散地绑定

处理Click事件,该事件不知道要执行哪个命令,而只是将要执行的命令名称传递给集中式CommandManager
一旦CommandManager接收到命令执行,它将仅使用Composite UI Application Block中的多对多功能来引发命令事件。
在实际执行命令之前,命令管理器将执行安全检查,这基本上是向我的SecurityManager询问是否已登录的用户可以执行命令字符串,安全规则是通过XML文件加载的,并且包含模式,例如'cmd:/ / myapp / finance / *'
一旦在接收命令上引发命令事件,它将负责通过基于视图模型的依赖关系确定状态和上下文。



我喜欢这种方法,因为它易于编写,耦合松散,并且仅允许命令通过通过DI找到的视图模型来获取接口状态。 Composite UI Application Block也使我很容易“启用/禁用/不可用”

类似地,我可以复制几乎所有内容,除了命令的“字符串”表示法外,这非常重要,因为我们编写的安全上下文可以通过处理诸如cmd://myapp/finance/*之类的命令模式来锁定整个部分,我们还可以让用户决定他们的命令快捷方式绑定等

对我的关键要求是:


命令需要用字符串表示,这是绝对必要的。
必须能够说明命令字符串是“启用”,“禁用”和“不可用”(意味着它应该在UI中隐藏)。
接口元素一定不知道如何处理命令或如何提供上下文,这是命令责任通过它发现的视图模型对象本身。
命令执行必须集中化,即我需要一个命令管理器对象来处理引发事件以执行命令执行以及维护撤消堆栈。


编辑:我刚刚考虑过如何通过使用MEF导出来提供提供命令名称的自定义元数据来提供命令绑定,ImportMany然后可以将它们加载到我的CommandManager中,这只是一个问题


告诉接口项目它们调用的Command String,以及;
允许命令字符串的状态更改(启用/禁用/不可用)。


编辑2:我想过一种解决方案,其中我的CommandManager接受一个Register(Control, String)可以在其中使用命令字符串注册控件的命令,然后命令管理器可以在状态元素更改时处理UI元素的启用/禁用/隐藏并将事件绑定到它们,这提供了更大的灵活性和去耦性,同时还允许用户自定义(移动菜单,按钮配置,键盘快捷键等)。尽管我没有使用WPF提供的ICommand功能的单个点,但这引起了一个担忧,最后我认为这并不重要,但是我想知道WPF提供的命令功能是否可以以我定义的简单方式使用。另一个优点是此方法不是WPF特定的,可以在任何地方使用。

最佳答案

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

但是针对您的问题,我只想说一句:如果您完全跳过ICommand,则肯定是wpf在幕后所做的事情。例如:ICommands CanExecute方法。 WPF命令管理器根据用户对应用程序的输入来重新查询该方法。否则,您将不得不处理“已启用” /“已禁用” /“不可用”的传播-状态自行更改并实现自己的逻辑以启用/禁用按钮。

命令还可以用于不仅仅是Click事件。

最后:命令可以在没有WPF的情况下执行-它只是一个接口,没有显式绑定到wpf

关于c# - WPF ICommand如何用简单的字符串表示以与UI松散耦合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com