在绑定更新源之前,如何确定用户何时更新了文本框中的文本?
我期待在 TextBox 或 Binding 上找到“IsDirty”属性...
我的问题是“取消”按钮 Enabled 属性绑定到 ViewModel 的 IsDirty 属性并且在焦点移出文本框之前被禁用。
"IsDirty" 需要定义为 ViewModel.IsDirty || 文本框.IsDirty
在绑定更新源之前,如何确定用户何时更新了文本框中的文本?
我期待在 TextBox 或 Binding 上找到“IsDirty”属性...
我的问题是“取消”按钮 Enabled 属性绑定到 ViewModel 的 IsDirty 属性并且在焦点移出文本框之前被禁用。
"IsDirty" 需要定义为 ViewModel.IsDirty || 文本框.IsDirty
WPF 无法支持用户在高质量应用程序中所期望的典型 IsDirty 行为。
问题源于Binder类的奇怪设计。
此外,WPF 架构对于使用默认的 Binder 实现是一种硬编码,替换它是一项艰巨的工作,并且需要许多“肮脏的技巧”来解决无休止的 WPF 设计缺陷。
我发现解决此限制的最简单方法是将所有值转换逻辑移动到视图模型并使用 UpdateSourceTrigger=PropertyChanged,并实现您自己的 IsDirty 和 IsInvalid 逻辑和标志。
这种方法也与 Caliburn.Micro 配合得很好
首先,为什么取消取消?它应该一直启用。任何其他行为都会很奇怪。用户应该可以取消,尽管他没有做任何事情。
其次,我会使用Commands
它,以便它可以根据视图模型的状态确定它是否可以执行。应该很容易实现,如果viewmodel也提供命令的实现。
我建议阅读一些关于它的文章和/或教程。谷歌的界面ICommand
。
并回答你的问题。假设您正在使用绑定,您可以使用INotifyPropertyChanging
接口来确定值何时将更改。然后,您可以将当前值存储在备份字段或其他内容中。
编辑 - 关于“让他丢失数据”
当然这是一个有效的策略。考虑一个更大的输入对话框,例如 5 个输入控件,在持久化输入之前必须对其进行验证。根据您的论点,我假设数据非常重要。此外,您开始将数据入侵到对话框中。在输入控件 3 上,您决定按“ALT + F4”。
首先,问问自己,用户为什么要按键?恕我直言,他不关心他的数据发生了什么。如果“ALT + F4”只是稳健的一个例子。忘掉它。我认为如果不非常昂贵,就无法实现绝对的鲁棒性。
其次,关于应用程序重新启动后的一致性和有效性,您必须将数据丢弃,以免您以未定义的状态开始。请记住,用户开始填写的实体在此状态下无效。状态和属性的值都不是。
所以恕我直言,更好的策略是以干净和定义的状态重新启动,以便用户能够继续执行您希望他对您的应用程序执行的任何操作。
为什么这个策略更好?好吧,实现起来要容易得多。更重要的论点是,用户永远不会因为奇怪的状态而迷路。