【问题标题】:WPF/SL - Derive from ICommand derivative or delegate to Execute/CanExecuteWPF/SL - 从 ICommand 派生或委托给 Execute/CanExecute 派生
【发布时间】:2011-11-10 02:24:26
【问题描述】:
似乎大多数 MVVM 框架都使用 ICommand 派生类,它们只是为视图中的 Execute/CanExecute 方法提供委托,而不是派生一个新类并覆盖 Execute/CanExecute 方法。
最好的设计是什么?为 ICommand 提供 Execute/CanExecute 时传入方法委托还是派生?
似乎派生会在其他视图中获得更多的命令可重用性并且可能更清洁?但是对于小型的 Execute/CanExecute 操作来说,创建一个新的派生类的开销太大了,仅仅将 delgates 传递给视图中的方法会更好吗?
感谢您对最佳做法的任何见解。
【问题讨论】:
标签:
wpf
silverlight
command
【解决方案1】:
ICommand 接口的主要不便之处在于该命令被“埋”在另一个类实例中。通常您希望该命令对公开ICommand 属性的类进行操作。
由 Josh Smith 推广的经典 RelayCommand 是通过为 Execute 和 CanExecute 方法提供 lambda 表达式来构建的。
通过为您的ICommand 方法使用lambda 表达式,您可以将命令“提升”回正在执行的类中。另一种选择是命令类和被命令类之间的紧密耦合,或者将操作发送回被命令类的转发方法。
lambda 表达式有权访问构建命令时范围内的私有成员。这大大减少了 ICommand 属性必须是单独的类实例的不便。
不过,充分通用的ICommand 利用类的公共 API 来完成其操作也是一种有用且可重用的实现模式。