如何执行命令?通过单例实用工具方法或通过OnPropertyChanged?

时间:2011-12-01 10:12:46

标签: c# wpf mvvm

假设其中一个ViewModel收到一些非常通用的命令(也可以从其他ViewModel执行,例如“stop ftp server”)。我该怎么办?

  • OnPropertyChanged事件传播到容器,在某个顶级视图中执行命令(MainWindowViewModel
  • 将一些“单件服务图层”类传递给每个ViewModel,直接在ViewModel中执行静态方法,如Utils.StopFtpServer()
  • 其他?

4 个答案:

答案 0 :(得分:1)

Microsoft使用静态命令。因此,使用定义所有这些全局命令的静态类并不是一个坏主意。

举一个关于我所说的话的例子:

    EditingCommands.AlignLeft

这是一个静态类,提供用于文本编辑的全局命令。

那就是说,我建议避免将业务逻辑放入命令中。将其封装到Business对象中并从命令中调用这些对象。通过这种方式,您可以将Gui和业务分离,并拥有更可测试的应用程序。

答案 1 :(得分:1)

如果你想以MVVM的方式做事,那么你就不应该将它填入View或View Model,或静态方法或Singleton。

FTP服务器应该是一个成熟的Model类。

  • View应该告诉View Model它想要执行StopFtpServerCommand
  • 视图模型应该告诉FtpServer实例FTP服务器应该Stop

这意味着您将支持多个FTP服务器实例,即使您未通过UI公开该支持。

如果你选择了这条路线,那么当你决定要多台FTP服务器时,你将避免将自己画成一个角落。它会迫使你为你的班级写一个更好的抽象,这样你就有可能在未来的课程中重复使用它。

与编写Singleton或静态方法相比,写入也不是一件非常具有挑战性。

如果您需要从多个视图模型访问同一个实例(您的问题似乎并不需要),那就是一个单独的挑战。我个人建议使用Dependency Injection之类的内容来解决此问题,因此您不会在View模型中调用new FtpServer()

答案 2 :(得分:0)

这两个人在宣传这个事件。 Singleton是一个测试不友好的构造,你真的不做测试不友好的功能 - 比如停止或启动一些服务。在这样的结构里面。

这个答案与MVVM没有任何关系。

答案 3 :(得分:0)

<Button Command="{Binding {x:Static business:MyStaticClass.MyStaticCommand}}" />

那样的东西?假设您拥有MyStaticClass中的逻辑,该逻辑应位于业务层