MVVM中的VM角色-它应该处理所有事情吗?为什么?
采用虚拟机以便更好地适应特定视图的限制在哪里?例如: 在UI(ex按钮)中应该有一个允许添加新项的命令。另外的要求是选择新项,确保其在控件上可见(比如TreeView控件),并开始编辑新添加的项(以便更改在VM中设置的预定义值)。假设控件没有自动机制来实现这一点,所以我们需要手动完成。因此,执行流程如下所示:MVVM中的VM角色-它应该处理所有事情吗?为什么?,mvvm,Mvvm,采用虚拟机以便更好地适应特定视图的限制在哪里?例如: 在UI(ex按钮)中应该有一个允许添加新项的命令。另外的要求是选择新项,确保其在控件上可见(比如TreeView控件),并开始编辑新添加的项(以便更改在VM中设置的预定义值)。假设控件没有自动机制来实现这一点,所以我们需要手动完成。因此,执行流程如下所示: 在VM上调用add命令-完成是视图的xaml 将SelectedItem设置为new item(通常我们将控件的SelectedItem属性绑定到VM的CurrentItem属性,然后将n
// in View's Click event handler
ViewModel.AddCommand.Execute(null);
EnsureVisibleSelectedItem();
BeginEdit();
…干净、清晰!如果我使用消息进行操作,会获得什么好处:
// in ViewModel's AddCommand
AddNewItem();
SetCurrentItem();
SendMessageToEnsureVisibleSelectedItem();
SendMessageToBeginEditSelectedItem();
…其中View已注册以接收这两条消息
我认为,用户界面可以改变,虚拟机应该能够在不改变自身的情况下采用新的用户界面,所以我不太理解当前在互联网上宣扬的MVVM政策。我会说“让它变得简单”
MVVM中真正重要的是:
- 不依赖于视图的内容应该放在ViewModel中(您的ViewModel不能以任何方式知道视图,而不仅仅是通过对象引用)
- 视图中的所有其他内容及其背后的代码
// in View's Click event handler
ViewModel.AddCommand.Execute(null);
EnsureVisibleSelectedItem();
BeginEdit();
与视图无关的所有内容都在ViewModel中,其他所有内容都在视图/代码中。这很好
如果我看一下你的第二个例子,就不会了:
// in ViewModel's AddCommand
AddNewItem();
SetCurrentItem();
SendMessageToEnsureVisibleSelectedItem();
SendMessageToBeginEditSelectedItem();
AddNewItem
正常(与视图无关),SetCurrentItem
正常(与视图无关),但是sendMessageToEnsuibleSelectedItem
和sendMessageToReginedITSelectedItem
呢?
enseRevible
通常对树视图很有用,但是如果您的视图不是用树视图构建的呢?如果控件会自动使新选定的项目可见呢?当然,您可以忽略该消息,但是您会在ViewModel中编写一些无用的代码,因为您认为视图需要它来显示UI
您通常在这里在ViewModel中编写了一些代码,以了解视图应该如何工作。是的,您减少了代码中的行数,但您肯定打破了这种模式
您的“旧时尚方式”实际上是满足您需求的好方式。您的ViewModel不知道视图,这才是重要的。我要说的是“简化”
MVVM中真正重要的是:
- 不依赖于视图的内容应该放在ViewModel中(您的ViewModel不能以任何方式知道视图,而不仅仅是通过对象引用)
- 视图中的所有其他内容及其背后的代码
// in View's Click event handler
ViewModel.AddCommand.Execute(null);
EnsureVisibleSelectedItem();
BeginEdit();
与视图无关的所有内容都在ViewModel中,其他所有内容都在视图/代码中。这很好
如果我看一下你的第二个例子,就不会了:
// in ViewModel's AddCommand
AddNewItem();
SetCurrentItem();
SendMessageToEnsureVisibleSelectedItem();
SendMessageToBeginEditSelectedItem();
AddNewItem
正常(与视图无关),SetCurrentItem
正常(与视图无关),但是sendMessageToEnsuibleSelectedItem
和sendMessageToReginedITSelectedItem
呢?
enseRevible
通常对树视图很有用,但是如果您的视图不是用树视图构建的呢?如果控件会自动使新选定的项目可见呢?当然,您可以忽略该消息,但是您会在ViewModel中编写一些无用的代码,因为您认为视图需要它来显示UI
您通常在这里在ViewModel中编写了一些代码,以了解视图应该如何工作。是的,您减少了代码中的行数,但您肯定打破了这种模式
您的“旧时尚方式”实际上是满足您需求的好方法。您的ViewModel不知道视图,这才是重要的。+1的意思是:“是的,在其代码背后。如果代码背后与视图相关,那么编写代码背后没有错。”谢谢您的评论,我的想法。似乎新的“助手”正在向其他方向发展。例如,如果您查看event2command,它是否使VM依赖于UI?我的意思是,在silverlight中可能存在Windows Phone API中不存在的具有特定参数的事件。通过这种方式,我们使VM依赖于特定的平台。@Goran
EventToCommand
用于XAML中(不在VM中)将事件“转换”为命令。然后,您的ViewModel会公开一个“标准”ICommand
属性,该属性绑定到XAML中的任何事件(由于EventToCommand
)中。VM实际上并不知道UI。但我真的不喜欢它。它