3

我有一个应用程序,其中有很多文本框和一些按钮,如保存、另存为等。

当用户编辑文本框时,我必须检查数据库的某个范围,验证范围并更新数据库。如果用户输入的值有任何错误,那么我不应该让 TextBox 失去焦点。

我为此使用了 LostFocus 事件,它工作正常,直到最近我在我的应用程序中发现了一个错误。

错误:用户在 TextBox 中编辑一个值,然后单击“保存”按钮;未调用 LostFocus 事件,因此数据库未更新:(

现在我的问题是我应该在 TextBox 中使用哪个事件来更新数据库。我尝试了 TextChanged 事件,但它会验证每个字符并使我的应用程序变慢。我在为这种应用程序选择正确的事件时感到困惑!

注意:** 按钮位于不同的 UserControl 中!

编辑 1:我在单击按钮时附加了一些命令,这些命令在 LostFocus 之前执行!我可以设置优先级或附加行为或命令之类的东西应该在 LostFocus 之后执行吗?

编辑 2:我只是通过禁用一些命令来调试应用程序,我发现在某些情况下,DelegateCommand 在 LostFocus 之前执行,所以我想避免这种情况。我该怎么办?在开发过程中,我觉得开发纯 MVVM 应用程序是不可能的,所以我有点使用了一些代码隐藏!

4

2 回答 2

1

我认为最好的方法是阻止用户继续操作,直到收集到所有有效信息。

就像带有Terms & Conditions DialogNext按钮的安装向导一样。在您选中I Agree复选框之前,Next按钮处于禁用状态。

这样,您不必担心用户在不提供有效信息的情况下继续操作。这样,您可以使用任何事件TextBox来验证您的数据。

于 2010-12-15T07:34:51.093 回答
1

将键盘焦点困在控件中通常是不良 UI 设计的标志 - 在用户可以在 UI 中的任何其他位置键入之前强制用户修复控件中的数据是非常不利于用户的。

也就是说,您根本不应该在这里使用事件。您正在尝试在 WPF 中编写 Windows 窗体应用程序。您应该编写一个 WPF 应用程序。

创建一个作为视图的逻辑模型的类——即,有一个string文本框的属性和一个保存按钮的Command属性(或者,更有可能是一个RelayCommand)。将文本框绑定到字符串属性,例如:

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

因为UpdateSourceTriggeris PropertyChanged,每次用户输入字符时源对象都会更新。

将按钮绑定到命令属性,例如:

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

实现(如Josh Smith 关于 MVVM 模式的基本文章中所述)所需的适当CanSaveSave方法,以便在字符串属性有效时启用按钮,在无效时禁用按钮。RelayCommand

于 2010-12-16T00:34:58.617 回答