如何确定WPF TextBox是否脏(使用UpdateSourceTrigger = LostFocus时)

时间:2013-02-21 12:30:39

标签: wpf

如何在Binding更新源之前确定用户何时更新了文本框中的文本?

我希望在TextBox或Binding上找到一个“IsDirty”属性......

我的问题是“取消”按钮Enabled属性绑定到ViewModel的IsDirty属性,并且在焦点移出文本框之前被禁用。

“IsDirty”需要定义为ViewModel.IsDirty || TextBox.IsDirty

2 个答案:

答案 0 :(得分:0)

首先,为什么取消被禁用?它应该一直启用。任何其他行为都会很奇怪。用户应该可以取消,尽管他没有做任何事情。

其次,我会使用Commands,以便它可以根据视图模型的状态确定是否可以执行它。应该很容易实现,如果viewmodel也提供了命令的执行 我建议阅读一些关于它的文章和/或教程。 Google用于界面ICommand

并回答您的问题。假设您正在使用绑定,您可以使用INotifyPropertyChanging接口来确定何时值即将发生变化。然后,您可以将当前值存储在备份字段或其他内容中。

编辑 - 关于“让他丢失数据”

当然这是一个有效的策略。想一想更大的输入对话框,例如5个输入控件,必须在保持输入之前进行验证。我假设根据你的论点,数据非常重要。此外,您开始将数据破解到对话框中。在输入控制3上,您决定按'ALT + F4'。

首先,问问自己,为什么用户按下按键?恕我直言,他不关心他的数据发生了什么。 如果'ALT + F4'只是一个健壮的例子。忘掉它。我认为如果不是非常昂贵,就无法实现绝对的稳健性。

其次,关于重新启动应用程序后的一致性和有效性,您必须抛弃数据,这样就不会以未定义的状态开始。请记住,用户开始填充的实体在此状态下无效。状态和状态值都不是。

所以恕我直言,更好的策略是以干净且定义的状态重新启动,以便用户能够继续使用您希望他对您的应用程序执行的任何操作。
为什么这个策略更好?嗯,实施起来要容易得多。更重要的论点是,用户永远不会因为奇怪的状态而迷失。

答案 1 :(得分:0)

WPF无法支持用户在高质量应用程序中所期望的典型IsDirty行为。

问题源于Binder类的奇怪设计。

此外,WPF架构是使用默认Binder实现的硬编码,取代它是一项巨大的工作,需要许多“肮脏的技巧”来解决无休止的WPF设计缺陷。

我找到解决此限制的最简单方法是将所有值转换逻辑移动到视图模型并使用UpdateSourceTrigger = PropertyChanged,并实现自己的IsDirty和IsInvalid逻辑和标志。

这种方法也适用于Caliburn.Micro