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

Is it the right way that command parameter references a view control in MVVM pattern?

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

顺便说一句,我在执行命令时遇到了一个问题。 是'Is it the right to send command parameter to UI control'?

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

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

这些是我的场景。

但我知道视图模型不应直接引用任何视图及其控件。

请告诉我怎么做。

如果您的验证是在 view/control 后面的代码中评估的,那么您可以发送或传递控件。

我不得不质疑 UI 层正在进行何种验证 - 它可以是一般输入逻辑(例如仅数字或仅某些字母等),但不应涉及任何商业逻辑。您背后的代码 可以 调用视图模型上的方法来执行基于业务逻辑的验证,但它应该避免传递控件。

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

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

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

与其将对 TextBox 的引用作为命令参数传递给视图模型命令,不如将 Text 属性 的值传递给 [=12] =] 作为一个 string 参数或者 - 甚至更好 - 你应该简单地将 TextBoxText 属性 绑定到 string 来源 属性视图模型:

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

源 属性 将在 TextBox 失去焦点时设置,您可以轻松地在 setter:

中启动验证逻辑
private string _s;
public string YourViewModelProperty
{
    get { return _s; }
    set { _s = value; Validate(); }
}

这就是 MVVM 模式应该如何实现的。