为什么iccommand比调用VM的代码更好?

本文关键字:代码 更好 VM iccommand 调用 为什么 | 更新日期: 2023-09-27 18:18:42

我的一个同事问我为什么他必须使用iccommand模式。

他想添加一个按钮,然后在后面的代码中为它创建一个事件。然后从他想要调用ViewModel上的方法的事件。

我给了他一个显而易见的答案:这增加了View和ViewModel之间的耦合。但是他认为View和ViewModel已经耦合了。(我们将视图的DataContext设置为视图模型后面的代码:DataContext = new MyViewModel();

是的,我告诉他,他的方式增加了"更多的耦合",但这听起来有点蹩脚,甚至对我来说。

所以,我知道iccommand是干净的方式,我这样做。但是除了不使用已经存在的耦合之外,iccommand还能为您带来什么呢?

为什么iccommand比调用VM的代码更好?

  • 这不是关于解耦的问题,而是你能在ModelView层次结构中渗透多深:不是事件泵送,而是事件路由,内置于框架中。

  • 这是关于UI管理:命令具有状态(CanExecute),如果将命令分配给控件,如果命令的状态变为false,则控件变为禁用。它提供了强大的UI状态管理方式,避免了大量的面条式编码,特别是对于复杂的UI。

我有一个同事问我为什么他必须使用iccommand模式。

似乎暗示这是贵公司的标准(无论是明确说明还是未说明)。这应该足以回答他的问题了。

如果所有公司代码都应该使用该模式,那么当其他人必须调试他的代码时,它可能会导致共同开发人员的困惑和沮丧。

另外,在我看来,使用iccommand可以更快地开发/模拟,因为您不需要在上下文中使用iccommand属性来运行程序。它可以让你的UI设计师(如果你足够幸运的话)完全完成他们的任务,即使你落后于你的编码。

iccommand还可以为您提供一个位置来处理是否可以立即使用特定按钮。这将通过canexecute方法处理。

您可以将命令的CanExecute方法绑定到控件的属性,Command也以一种很好的方式封装了操作。在我的观点/经验中,这种方法非常有意义,因为您在单个抽象中同时拥有条件和执行操作,这使得它更容易理解和测试。

如果将来您发现这个动作重复,您可以在您自己的自定义iccommand中轻松地抽象它,并在几个地方使用它。

我在前面的回答中没有看到的一件事是,使用iccommand通过允许不同的GUI组件使用相同的操作来促进代码重用。例如,如果我有一个应该导致打开窗口的命令,并且该命令可以在应用程序中的三个或不同屏幕中调用,那么iccommand实现允许我在单个位置定义该逻辑。对于代码背后的事件处理程序,我必须复制和粘贴冗余代码,这违反了DRY(否则,我必须通过抽象到一个类来实现自己的实现,此时,我不妨使用iccommand)。