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

时间:2017-04-24 09:17:33

标签: wpf mvvm command

我正在使用MVVM模式创建一个页面。

顺便说一句,我在执行命令时遇到了一个问题。 它是'是否有权将命令参数发送到UI控件'?

例如,我有一个TextBox控件。当触发LostFocus事件时,将引发与TextBox绑定的验证命令,并且我将发送UI控件作为命令参数以显示验证失败消息。

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

这些是我的情景。

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

请告诉我怎么做。

2 个答案:

答案 0 :(得分:1)

如果您的视图/控件后面的代码中评估了您的验证,那么您可以发送或传递控件。

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

如果您只是想找到一种为多个控件制作通用验证方法的方法,那么您应该考虑另一种方式,例如:

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

答案 1 :(得分:1)

视图模型不应对任何UI控件(例如TextBox)具有任何引用或任何依赖性。

不应将对TextBox的引用作为命令参数传递给视图模型命令,而应将Text的{​​{1}}属性的值作为{{{ 1}}参数或 - 甚至更好 - 您应该只将TextBox的{​​{1}}属性绑定到视图模型的string源属性:

Text

TextBox失去焦点时,将设置source属性,您可以轻松地在setter中启动验证逻辑:

string

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