2011-12-01 44 views
0

假设其中一个ViewModel接收一些相当通用的命令(也可以从其他ViewModel执行,例如“stop ftp server”)。我该怎么办?如何执行命令?通过单身实用程序方法或通过OnPropertyChanged?

  • 传播完成OnPropertyChanged事件容器,在一些顶层视图执行命令(MainWindowViewModel
  • 通过一些“单独服务层”级到每个ViewModel,直接在ViewModel执行静态方法,像Utils.StopFtpServer()
  • 其他?
+0

视图应负责尽可能少的与视图无关的应用程序逻辑。 FTP服务器与View无关。但我个人不喜欢单身人士,所以我也不会使用这个选项。在你的例子中,我倾向于创建一个具有Stop方法的'FtpServer'类,并将它的一个实例传递给所有关注它的视图模型。我也会通过依赖注入将它传递给这些视图模型,所以我可以在将来替代它的实现。视图模型如何知道停止是另一个问题,你 - 你能解释一下吗? –

+0

目前还不清楚你试图达到什么目的。 ViewModel如何接收命令“Stop ftp server”? –

+0

嗯为什么View Model会收到这条消息,除非它特别关注它 - 在这种情况下,有人也会听命令。 –

回答

1

静态命令由微软使用。因此,使用定义所有这些全局命令的静态类是不错的主意。

为了给什么我已经说过一个例子:

EditingCommands.AlignLeft 

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

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

+0

“单身服务层” - 从未听说过。你能提供一个链接吗? –

+0

我重复了OP概念的名称,我用斜体表示它不是这个的正式名称。我会编辑我的帖子以避免进一步的误解。 –

0

这两个去与传播事件。辛格尔顿是一个不友好的测试结构,你真的不要去测试不友好的功能,比如停止或启动一些服务。里面有这样一个构造。

此答案与MVVM无关。

1

如果你想要做的事情的MVVM方式,那么你不应该塞进视图或视图模型,或静态方法或辛格尔顿这一点。

FTP服务器应该是一个完整的Model类。

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

这意味着你将支持多实例视图模型的FTP服务器,即使您不会通过UI公开该支持。

如果你走这条路,你会避免自己画成一个角落在未来,当你决定要多的FTP服务器。它会迫使你为你的课程写一个更好的抽象,这样你会更有可能在未来的程序中重用它。

与编写单例或静态方法相比,编写应用程序也不是很有挑战性。

如果您需要从多个视图模型(这似乎你的问题并不需要)访问同一个实例,这是一个独立的挑战。我个人建议使用Dependency Injection这样的东西来解决这个问题,所以你不要在视图模型里面调用new FtpServer()

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

这样的事情?假设您拥有MyStaticClass中的逻辑,该逻辑应位于业务层中