我正在使用 WPF、MVVM-Light。在我的 UI 中,我有一个文本框,我想阻止用户在文本框中输入某些字符。我知道如果我们使用代码隐藏我可以处理按键按下 keyPress 事件,我可以通过 MVVM 实现它吗?我们可以使用一些行为或一些交互触发器吗?
2 回答
在 MVVM 中使用代码隐藏是完全可以的,因为代码隐藏仅与您的视图相关。
因此,如果您有一些特定于视图的逻辑“用户只能在此框中键入数字”,那么为仅允许处理数字键的事件编写一个KeyPress
事件是完全可以的。TextBox
您甚至可以将其放入 aUserControl
中,以便它可以重复使用。
但是,如果您允许的字符逻辑基于应用程序逻辑,例如“用户只能将 app.config 文件中定义的字符用于此字符串值”,那么您最好在 ViewModel 中验证它。
另请注意,限制与验证不同。
如果您想验证用户的输入,那么我会使用IDataErrorInfo
ViewModel 层来执行此操作,并且可能使用模式为的绑定,UpdateSourceTrigger=PropertyChanged
以便在每次按键后检查验证。
如果您想限制可以在 a 中键入的字符TextBox
,那么我可能会从后面代码中的 View 层执行此操作,因为这是 View 的功能。
是的,要以 MVVM 方式过滤输入,我建议使用自定义控件(例如屏蔽TextBox
控件)或 Behavior。
我最近在寻找一个好的蒙面TextBox
,Xceed 有一个免费的,你可以在这里找到。我不能谈论这个,因为我没有使用过它,但我对我过去使用过的其他 Xceed 组件感到满意。
但是我不想去第三方并包含一堆我不需要的控件,所以我最终创建了一个简单地附加到TextBox
并基于 FilterType 过滤输入的行为。该行为很容易创建,您只需使用该PreviewTextInput
事件来过滤掉您不想要的字符。
这个 SO Answer有许多关于如何过滤/屏蔽输入的建议和链接,如果您不熟悉创建附加行为,此示例显示了如何为屏蔽文本框创建附加行为。