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

如何确定WPF文本框是否脏(使用UpdateSourceTrigger=LostFocus时),wpf,Wpf,在绑定更新源之前,如何确定用户何时更新了文本框中的文本 我希望在文本框或绑定上找到“IsDirty”属性 我的问题是,“取消”按钮启用属性绑定到ViewModel的IsDirty属性,并且在焦点移出文本框之前处于禁用状态 “IsDirty”需要定义为ViewModel.IsDirty | | TextBox.IsDirty首先,为什么禁用取消?它应该一直处于启用状态。任何其他行为都是奇怪的。用户应该能够取消,尽管他没有做任何事情 其次,我将使用命令,以便它可以根据viewmodel的状态确定是否

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

我希望在文本框或绑定上找到“IsDirty”属性

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

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

首先,为什么禁用取消?它应该一直处于启用状态。任何其他行为都是奇怪的。用户应该能够取消,尽管他没有做任何事情

其次,我将使用
命令
,以便它可以根据viewmodel的状态确定是否可以执行它。如果viewmodel还提供了命令的实现,则应易于实现。
我建议读一些关于它的文章和/或教程。谷歌搜索界面
ICommand

回答你的问题。假设您使用的是绑定,您可以使用
INotifyPropertyChanging
接口来确定值将要更改的时间。然后可以将当前值存储在备份字段或其他内容中

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

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

首先,问问自己,用户为什么要按键?他不在乎他的数据发生了什么。 如果“ALT+F4”只是健壮的一个例子。算了吧。我认为绝对的健壮性不可能在不付出高昂代价的情况下实现

第二,关于重新启动应用程序后的一致性和有效性,您必须扔掉数据,以免以未定义的状态启动。请记住,用户开始填充的实体在此状态下无效。这两种状态都不分别表示属性的值为

因此,我认为更好的策略是以干净且定义好的状态重新启动,以便用户能够继续执行您希望他对应用程序执行的任何操作。
为什么这个策略更好?嗯,它更容易实现。还有一个更重要的论点,用户永远不会因为奇怪的状态而迷路。

首先,为什么取消被禁用?它应该一直处于启用状态。任何其他行为都是奇怪的。用户应该能够取消,尽管他没有做任何事情

其次,我将使用
命令
,以便它可以根据viewmodel的状态确定是否可以执行它。如果viewmodel还提供了命令的实现,则应易于实现。
我建议读一些关于它的文章和/或教程。谷歌搜索界面
ICommand

回答你的问题。假设您使用的是绑定,您可以使用
INotifyPropertyChanging
接口来确定值将要更改的时间。然后可以将当前值存储在备份字段或其他内容中

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

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

首先,问问自己,用户为什么要按键?他不在乎他的数据发生了什么。 如果“ALT+F4”只是健壮的一个例子。算了吧。我认为绝对的健壮性不可能在不付出高昂代价的情况下实现

第二,关于重新启动应用程序后的一致性和有效性,您必须扔掉数据,以免以未定义的状态启动。请记住,用户开始填充的实体在此状态下无效。这两种状态都不分别表示属性的值为

因此,我认为更好的策略是以干净且定义好的状态重新启动,以便用户能够继续执行您希望他对应用程序执行的任何操作。

为什么这个策略更好?嗯,它更容易实现。更重要的论点是,用户永远不会因为奇怪的状态而迷失方向。

WPF不能支持用户在高质量应用程序中期望的典型IsDirty行为

这个问题源于活页夹类的奇怪设计

此外,WPF体系结构有点硬编码为使用默认绑定器实现,替换它是一项巨大的工作,需要许多“肮脏的技巧”来解决无休止的WPF设计缺陷

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


这种方法同样适用于Caliburn。Micro

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

这个问题源于活页夹类的奇怪设计

此外,WPF体系结构有点硬编码为使用默认绑定器实现,替换它是一项巨大的工作,需要许多“肮脏的技巧”来解决无休止的WPF设计缺陷

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

这种方法同样适用于Caliburn.Micro