MVVM和有状态命令 - 好主意还是坏主意?

时间:2009-08-24 19:39:25

标签: wpf mvvm command cinch

我以为我会在这里发帖,希望有MVVM专业知识的人能够提出以下是否是个好主意的意见:

我正在使用Sacha Barber的Cinch MVVM框架,其中包括Marlon Grech的SimpleCommand类。

这个类没有其他一些替代方法的一件事是Text属性,它通常用于将UI元素绑定到命令操作的“Title”。因此,我一直在编写一个公开Text属性的类的扩展。

现在,我遇到的是一个用例,我正在使用命令切换到设备的连接。我可以通过一系列不同的方式实现这一点(并不总是 - 它是软件!)。一种方法是从我的ViewModel公开多个命令对象 - 一个用于'Disconnect',一个用于'Connect;让视图模型公开一个指示连接状态(IsConnected)的属性,并使视图有条件地绑定到Connect命令或Disconnect命令。我对这个选项的反应是......哎呀!

我最初开始考虑的不仅是提供Text属性,还让命令对象实现INotifyPropertyChanged,以便viewmodel可以根据系统状态动态地将text属性更改为“Connect”或“Disconnect”。这样做,我可以避免使用多个命令,只需公开一个'ToggleConnection'命令对象。

从这条路径开始,我发现可能存在此模式的其他变体,因此UI需要根据命令状态进行更改。例如,除了根据连接状态更改命令的文本外,您可能还需要根据连接状态更改图标的位置。因此,我开始编写一个实现INotifyPropertyChanged的“有状态”类,并公开两个属性 - “Text”和“State”。我已经使类成为通用的,以便用户可以定义State的类型(我通常不喜欢在可避免的地方使用'object'。)

我的问题是......你认为这是一个好主意还是坏主意?它可能与命令的初衷/设计不同;从我所看到的情况来看,一般情况下,命令对象是无状态的,因为它们是系统的“动词”。使用路由命令,如果我正确理解了事情,那么通常只能指望命令的目标具有状态。特别是因为根据声明命令绑定的位置,可以将相同的命令路由到不同的处理程序。

所以,我认为至少对于路由命令,状态是没有意义的。

但是,我没有处理路由命令 - 我专门处理MVVM命令。在这种情况下,基本上没有命令的条件路由 - MVVM视图直接绑定到特定的viewmodel的命令对象,它是execute和canexecute处理程序。

在这种情况下,它有意义吗?

我附上了相关代码的副本,以防它的使用/兴趣。

谢谢, 菲尔

2 个答案:

答案 0 :(得分:1)

您认为更容易合作,这取决于您。

我个人不会将.Text属性放在我的命令上,因为我没有重用这些命令。它与框架中提供的RoutedUICommands(或类似的自定义静态命令)不同,因为它们在任何地方都可以重用,如果“Exit”的转换要在该命令上进行更改,它将在整个应用程序中得到反映。在你的例子中并非如此 - 一切都是一次性的。

在你的情况下,你的按钮文本的这个文本实际上与你的命令分离(即使一个影响另一个),所以它可能最终变得更容易,并且更少的代码来解耦它们,但差异不是'会变得那么多,它最终将成为一种品味问题。

我肯定和你在两个命令上的事情 - blech。你写的大多数按钮代表都必须以某种方式对状态作出反应(你说话的服务是关闭的,如果用户选择了这个数据需要以这种方式填充,等等),所以我真的不认为这是错误的。委托适应ViewModel上的有状态信息。

无论如何,这有点罗嗦......外卖是“做任何感觉舒服”。

答案 1 :(得分:0)

就像上一张海报所说的那样,“无论感觉舒适。”

在我的情况下,我通常使用DelegateCommand之类的东西。如果我需要绑定到某些数据,我将绑定到VM。执行命令时,它在我的VM中执行(通过在init提供给DelegateCommand的委托)。然后执行的委托可能/可能不会运行一些可重用的代码来满足命令。

听起来你想使用Command作为它自己的VM。我从未想过要在自己面前这样做,但如果对你感觉良好,那就去做吧! :)