MVVM中的VM角色-它应该处理所有事情吗?为什么?

MVVM中的VM角色-它应该处理所有事情吗?为什么?,mvvm,Mvvm,采用虚拟机以便更好地适应特定视图的限制在哪里?例如: 在UI(ex按钮)中应该有一个允许添加新项的命令。另外的要求是选择新项,确保其在控件上可见(比如TreeView控件),并开始编辑新添加的项(以便更改在VM中设置的预定义值)。假设控件没有自动机制来实现这一点,所以我们需要手动完成。因此,执行流程如下所示: 在VM上调用add命令-完成是视图的xaml 将SelectedItem设置为new item(通常我们将控件的SelectedItem属性绑定到VM的CurrentItem属性,然后将n

采用虚拟机以便更好地适应特定视图的限制在哪里?例如:

在UI(ex按钮)中应该有一个允许添加新项的命令。另外的要求是选择新项,确保其在控件上可见(比如TreeView控件),并开始编辑新添加的项(以便更改在VM中设置的预定义值)。假设控件没有自动机制来实现这一点,所以我们需要手动完成。因此,执行流程如下所示:

  • 在VM上调用add命令-完成是视图的xaml
  • 将SelectedItem设置为new item(通常我们将控件的SelectedItem属性绑定到VM的CurrentItem属性,然后将new item分配给CurrentItem)
  • 确保新项目在控件上可见-这必须在视图的代码隐藏中完成
  • 开始编辑-这必须在视图的代码隐藏中完成
  • 现在,由于网络上到处都有关于将消息用于几乎所有事情的文章,有一个问题:

    如果我以简单的旧方式进行操作,我会破坏什么?我在添加新项时使用Click事件而不是命令绑定,在方法中我会这样做:

    // 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。但我真的不喜欢它。它