【发布时间】:2008-12-02 19:27:11
【问题描述】:
我正在学习来自 WinForms 开发的 WPF。
我有一个 TextChanged 事件分配给我的 WPF 应用程序中的一个 TextBox。如果用户输入了无效数据,我希望能够恢复到之前的文本值。
在旧形式的日子里,我会用 OldValue 替换 NewValue,但 WPF 的工作方式似乎不一样。
有什么想法可以做到这一点吗?我只是还没有考虑 WPF 吗?
谢谢。
【问题讨论】:
我正在学习来自 WinForms 开发的 WPF。
我有一个 TextChanged 事件分配给我的 WPF 应用程序中的一个 TextBox。如果用户输入了无效数据,我希望能够恢复到之前的文本值。
在旧形式的日子里,我会用 OldValue 替换 NewValue,但 WPF 的工作方式似乎不一样。
有什么想法可以做到这一点吗?我只是还没有考虑 WPF 吗?
谢谢。
【问题讨论】:
您可以通过两种方式做到这一点:
监听PreviewTextInput 事件并设置e.Handled = true 以停止TextChanged 事件。
使用 WPF 验证。有一个great post by Paul Stovell on Codeproject 和一个recent post on his blog。
这些文章将帮助您入门。我第一次进行验证时遇到的一件事是验证规则仅在绑定更新源时运行。
【讨论】:
TextBox,因为Text 属性是直接设置的;如果您想防止此类事件,您可能需要为 ApplicationCommands.Paste 添加一个处理程序。
我会使用 PreviewTextInput,WPF 中的大多数事件都有一个 Preview 兄弟。如果您设置 e.Handled = true 它将阻止事件进一步冒泡/隧道。
我不确定您是否知道,但据说预览事件是隧道式的,即。它们从最外面的容器开始,并发布在每个容器中,直到它到达具有焦点的控件。非预览事件被称为冒泡,即。它们从具有焦点的控件开始,并发布到每个父控件。
如果您在最外层网格的 PreviewTextChanged 事件上设置 e.Handled = true,则您也会取消所有其他事件,包括 TextChanged。首先,所有预览事件从最外层触发到具有焦点的控件,然后所有非预览事件从具有焦点的控件触发,并发送到最外层的父控件。
【讨论】:
PreviewTextChanged。