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

标签 wpf mvvm command cinch

我想我会在这里发帖,希望也许有 MVVM 专业知识的人能够就以下是否是一个好主意提供意见:

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

这个类没有其他替代品的一个属性是 Text 属性,它通常可用于将 UI 元素绑定(bind)到命令操作的“标题”。因此,我一直在为这个类编写一个扩展,它公开了一个 Text 属性。

现在,我遇到的是一个用例,我使用命令来切换与设备的连接。有很多不同的方法可以实现这个(并不总是存在 - 它是软件!)。一种方法是从我的 ViewModel 中公开多个命令对象——一个用于“断开连接”,一个用于“连接”;让 View 模型公开一个指示连接状态 (IsConnected) 的属性,并让 View 有条件地绑定(bind)到 Connect 命令或 Disconnect 命令。不过,我对这个选项的 react 是……糟糕!

我最初开始关注的不仅是提供一个 Text 属性,而且还让命令对象实现 INotifyPropertyChanged ,以便 View 模型可以根据系统状态将文本属性动态更改为“连接”或“断开连接”。这样做,我可以避免使用多个命令,而只公开一个“ToggleConnection”命令对象。

不过,从这条路开始,我突然想到,这种模式可能还有其他变体,因此 UI 需要根据命令状态进行更改。例如,除了根据连接状态更改命令的文本外,您可能还有一些地方需要根据连接状态更改图标。因此,我开始编写一个实现 INotifyPropertyChanged 的​​“有状态”类,并公开两个属性——“文本”和“状态”。我已将类设为通用类,以便用户可以定义 State 的类型(我通常不喜欢在可避免的情况下使用“对象”)。

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

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

但是,我不是在处理路由命令——我是在专门处理 MVVM 命令。在这种情况下,基本上没有命令的条件路由 - MVVM View 直接绑定(bind)到特定 View 模型的命令对象,它是执行和可以执行的处理程序。

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

我已附上相关代码的副本,以防它有用/感兴趣。

谢谢,
菲尔

最佳答案

这真的取决于你认为什么会更容易使用。

我个人不会将 .Text 属性放在我的命令上,因为我无法重用这些命令。它与框架中提供的 RoutedUICommands(或类似的自定义静态命令)不同,因为它们在任何地方都被重用,如果“退出”的翻译在该命令上发生更改,它将反射(reflect)在整个应用程序中。在您的示例中并非如此 - 一切都是一次性的。

在您的情况下,您的按钮文本的此文本确实与您的命令分离(即使一个会影响另一个),因此最终可能会更容易并且将它们分离的代码更少,但差异不会这么多,它最终将成为一个比什么都重要的品味问题。

在 2 个命令的问题上,我绝对支持你 - blech。您编写的大多数按钮代表都必须以某种方式对状态使用react(您与之交谈的服务已关闭,如果用户选择了此数据,则需要以这种方式填充此数据,等等),所以我真的不认为这是错误的委托(delegate)适应 ViewModel 上的状态信息。

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

关于wpf - MVVM 和有状态命令 - 好主意还是坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324309/

相关文章:

c# - 如何以编程方式读取附加依赖属性的值?

wpf - 将禁用的列表框背景更改为灰色

php - Telegram bot - 从没有斜杠的键盘获取用户响应(命令)

java - 区分一字、二字和三字命令

c# - 在 C# 代码中更改 WPF 窗口背景图像

C# XAML - 获取 XAML 内容属性 (contentControl.Content)

wpf - 我应该使用什么 MVVM 框架?

c# - 通过 IsVisibility 控制 Telerki GridViewDataColumn 的可见性

c# - 应用程序启动检查,我应该在 MVVM 模式中的什么地方执行它们?

ruby-on-rails - 从 RoR Web 应用程序运行 linux 命令(即 ls)