Wpf 命令参数引用MVVM模式中的视图控件的方式是否正确?

Wpf 命令参数引用MVVM模式中的视图控件的方式是否正确?,wpf,mvvm,command,Wpf,Mvvm,Command,我正在使用MVVM模式制作一个页面 顺便说一下,我在执行命令时遇到了一个问题。 它是“向UI控件发送命令参数是否正确” 例如,我有一个文本框控件。当LostFocus事件被激发时,将引发一个绑定了TextBox的验证命令,我将发送一个UI控件作为命令参数,以显示验证失败消息 执行命令后,如果验证失败,我将更改UI控件的内容值 这是我的设想 但我知道viewmodel不应该直接引用任何视图及其控件 请告诉我怎么做 如果在视图/控件的代码隐藏中评估验证,则可以发送或传递控件 我不得不质疑在UI层进行

我正在使用MVVM模式制作一个页面

顺便说一下,我在执行命令时遇到了一个问题。 它是“向UI控件发送命令参数是否正确”

例如,我有一个文本框控件。当LostFocus事件被激发时,将引发一个绑定了TextBox的验证命令,我将发送一个UI控件作为命令参数,以显示验证失败消息

执行命令后,如果验证失败,我将更改UI控件的内容值

这是我的设想

但我知道viewmodel不应该直接引用任何视图及其控件


请告诉我怎么做

如果在视图/控件的代码隐藏中评估验证,则可以发送或传递控件

我不得不质疑在UI层进行的是什么样的验证——它可以是一般的输入逻辑(如仅数字或某些字母等),但不应该涉及任何业务逻辑。您的代码隐藏可以调用viewmodel上的方法来执行基于业务逻辑的验证,但它应该避免传递控件

如果您只是在寻找一种方法来为多个控件创建通用的验证方法,那么您应该考虑另一种方式,例如:

  • 创建具有验证的自定义usercontrol
  • 使用附加行为

如果在视图/控件的代码后面对验证进行了评估,则可以发送或传递控件

我不得不质疑在UI层进行的是什么样的验证——它可以是一般的输入逻辑(如仅数字或某些字母等),但不应该涉及任何业务逻辑。您的代码隐藏可以调用viewmodel上的方法来执行基于业务逻辑的验证,但它应该避免传递控件

如果您只是在寻找一种方法来为多个控件创建通用的验证方法,那么您应该考虑另一种方式,例如:

  • 创建具有验证的自定义usercontrol
  • 使用附加行为

    • 视图模型不应该对任何UI控件(如
      文本框)有任何引用或依赖关系

      而不是将对
      文本框的引用作为命令参数传递给视图模型命令,您应该将
      TextBox
      Text
      属性的值作为
      string
      参数传递,或者更好的是,您应该将
      TextBox
      Text
      属性绑定到视图模型的
      string
      源属性:

      <TextBox Text="{Binding YourViewModelProperty}" />
      

      这就是MVVM模式的实现方式。

      视图模型不应该对任何UI控件(如
      文本框)有任何引用或依赖关系

      而不是将对
      文本框的引用作为命令参数传递给视图模型命令,您应该将
      TextBox
      Text
      属性的值作为
      string
      参数传递,或者更好的是,您应该将
      TextBox
      Text
      属性绑定到视图模型的
      string
      源属性:

      <TextBox Text="{Binding YourViewModelProperty}" />
      

      这就是MVVM模式的实现方式。

      要进行验证,可以使用“IDataErrorInfo”或“INotifyDataErrorInfo”接口。这些交互与MVVM模式配合得很好。请看一下这篇教程:你可以看看我的问题,也许它会帮助你:为了验证,你可以使用“IDataErrorInfo”或“INotifyDataErrorInfo”界面。这些交互与MVVM模式配合得很好。请看一下这篇教程:你可以看看我的问题,也许它会对你有帮助:谢谢你善意的回答。谢谢你善意的回答。谢谢你善意的回答。谢谢你善意的回答。谢谢你善意的回答。