假设其中一个ViewModel收到一些非常通用的命令(也可以从其他ViewModel执行,例如“stop ftp server”)。我该怎么办?
OnPropertyChanged
事件传播到容器,在某个顶级视图中执行命令(MainWindowViewModel
)ViewModel
,直接在ViewModel
中执行静态方法,如Utils.StopFtpServer()
答案 0 :(得分:1)
Microsoft使用静态命令。因此,使用定义所有这些全局命令的静态类并不是一个坏主意。
举一个关于我所说的话的例子:
EditingCommands.AlignLeft
这是一个静态类,提供用于文本编辑的全局命令。
那就是说,我建议避免将业务逻辑放入命令中。将其封装到Business对象中并从命令中调用这些对象。通过这种方式,您可以将Gui和业务分离,并拥有更可测试的应用程序。
答案 1 :(得分:1)
如果你想以MVVM的方式做事,那么你就不应该将它填入View或View Model,或静态方法或Singleton。
FTP服务器应该是一个成熟的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中的逻辑,该逻辑应位于业务层
中