【问题标题】:Is it the right way that command parameter references a view control in MVVM pattern?命令参数引用MVVM模式中的视图控件是否正确?
【发布时间】:2017-09-20 21:39:58
【问题描述】:

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

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

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

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

这些是我的场景。

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

请告诉我怎么做。

【问题讨论】:

标签: wpf mvvm command


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的友好回答。
【解决方案2】:

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

您应该将TextBoxText 属性的值作为string 参数传递,而不是将TextBox 的引用作为命令参数传递给视图模型命令,或者——甚至更好- 你应该简单地将TextBoxText 属性绑定到视图模型的string 源属性:

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

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

private string _s;
public string YourViewModelProperty
{
    get { return _s; }
    set { _s = value; Validate(); }
}

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

【讨论】:

  • 感谢您的友好回答。
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
相关资源
最近更新 更多