我正在使用MVVM模式创建一个页面。
顺便说一句,我在执行命令时遇到了一个问题。 它是'是否有权将命令参数发送到UI控件'?
例如,我有一个TextBox控件。当触发LostFocus事件时,将引发与TextBox绑定的验证命令,并且我将发送UI控件作为命令参数以显示验证失败消息。
执行命令后,如果验证失败,我将更改UI控件的内容值。
这些是我的情景。
但是我知道一个viewmodel不应该直接引用任何视图及其控件。
请告诉我怎么做。
答案 0 :(得分:1)
如果您的视图/控件后面的代码中评估了您的验证,那么您可以发送或传递控件。
我不得不质疑在UI层进行什么样的验证 - 它可以是通用输入逻辑(仅限数字或仅限某些字母等),但它不应涉及任何业务逻辑。您在后面的代码可以调用viewmodel上的方法来执行基于业务逻辑的验证,但它应该避免传递控件。
如果您只是想找到一种为多个控件制作通用验证方法的方法,那么您应该考虑另一种方式,例如:
答案 1 :(得分:1)
视图模型不应对任何UI控件(例如TextBox
)具有任何引用或任何依赖性。
不应将对TextBox
的引用作为命令参数传递给视图模型命令,而应将Text
的{{1}}属性的值作为{{{ 1}}参数或 - 甚至更好 - 您应该只将TextBox
的{{1}}属性绑定到视图模型的string
源属性:
Text
当TextBox
失去焦点时,将设置source属性,您可以轻松地在setter中启动验证逻辑:
string
这就是MVVM模式的实现方式。