所以我对MVVM相当陌生,我一直在关于用户输入验证的一些问题上挣扎。 WPF有一些内置的功能,似乎像“魔术”一样工作,并且通常我知道“魔术”不好。WPF的“好”特性真的很棒吗?还是他们太控制?
例如:如果绑定TextBox
到具有类型的double
和用户输入的“hello”成TextBox
一个属性,WPF自动显示TextBox
围绕红色边框通知该输入的用户无效。
这一切都很好,但它确实看起来像“魔法”。一位经验丰富的开发人员告诉我,WPF和类似的应用程序构建者想要控制太多。他表示,在Web开发中,View不知道该属性是什么类型。这对我有意义。所以这导致我的一般问题 - 应该WPF视图了解属性类型? - 如果我将Property属性声明为string
,那么我可以通过视图对完成控制。而不是必须解决WPF的“聪明”TextBox
“魔术”。
另一种表达我的问题的方式是 - 应该在Model或ViewModel中声明属性类型吗?
我明白,如果你在型号为double
,并为string
在视图模型申报物业类型必须在模型中分析。在我看过的MVVM应用程序的大多数示例中,Property类型在整个应用程序中都是相似的,但我认为不理解它使用的“愚蠢”视图会好很多。
返回我的示例:如果将该属性声明为String
,则可以完全控制输入所需的格式并防止无效输入。这似乎是一个比信任WPF TextBox
更好的解决方案。
当您将一个'TextBox'绑定到double并键入像“hello”这样的字符串时,我认为实际发生的事情是WPF尝试将您的double值设置为字符串值,并引发异常。这种例外是导致红色边框出现在“TextBox”周围并显示错误消息,而不是任何特殊处理的原因。你可以轻易地在setter中为你的double属性抛出一个异常,并且会发生同样的事情。我不会真的称之为“魔术”,只是异常处理:) – Rachel 2013-02-26 14:34:10
@Rachel我同意,但为什么不完全控制自己的输入?是的,当类型是“double”时,可以稍微控制它,但不如它是一个字符串。你可以创建一个几乎不可能破解的应用程序。我只是认为'View'应该是一种愚蠢的! – 2013-02-26 14:39:00
我不知道为什么你会想要一个额外的图层。 WPF有两层:一个数据层和一个UI层。数据层应该代表你的数据。如果你有一个数字,它应该是一个数字数据类型,而不是一个字符串数据类型。用户界面层意味着为用户提供了一个友好的数据界面,因此您可以使用“文本框”来显示您的数字值,以便最终用户可以轻松编辑它。如果你强制你的数据层使用字符串而不是数字,因为你使用的是“TextBox”,那么你让UI控制你的应用程序,这不是WPF应该如何工作的。 – Rachel 2013-02-26 14:48:16