应该使用哪个事件从WPF中的文本框(LostFocus、LostKeyboardFocus等)更新模型?如何在WPF中设置事件的优先级?

应该使用哪个事件从WPF中的文本框(LostFocus、LostKeyboardFocus等)更新模型?如何在WPF中设置事件的优先级?,wpf,events,textbox,updatemodel,lostfocus,Wpf,Events,Textbox,Updatemodel,Lostfocus,我有一个应用程序,其中有许多文本框和一些按钮,如保存、另存为等。 当用户编辑文本框时,我必须检查数据库中的某个范围,验证该范围并更新数据库。 如果用户输入的值有任何错误,那么我不应该让文本框失去焦点 我一直在使用LostFocus事件来解决这个问题,它工作得很好,直到最近我在应用程序中发现了一个bug 错误:用户在文本框中编辑一个值,然后单击保存按钮;未调用LostFocus事件,因此未更新数据库:( 现在我的问题是,我应该在TextBox中使用哪个事件来更新数据库。我尝试了TextChange

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

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

我一直在使用LostFocus事件来解决这个问题,它工作得很好,直到最近我在应用程序中发现了一个bug

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

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

注意:**按钮位于不同的用户控件中

编辑1:我在点击按钮时附加了一些命令,这些命令在LostFocus之前执行!!我是否可以设置优先级或类似附加行为的内容,或者在LostFocus之后执行命令


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

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

就像一个安装向导,它有
条款和条件对话框
下一步
按钮。在您选中
我同意
复选框之前,
下一步
按钮将被禁用


通过这种方式,您不必担心用户在未提供有效信息的情况下继续操作。通过这种方式,您可以使用
文本框上的任何事件来验证您的数据。

将键盘焦点捕获在控件中通常是一种糟糕的UI设计的迹象-在用户可以键入之前强迫用户修复控件中的数据是非常不友好的用户界面中的任何其他位置

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

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

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

实施相应的
CanSave
Save
方法,这些方法由
RelayCommand
执行(如MVVM模式的基本文章所述)需要,以便在字符串属性有效时启用按钮,在无效时禁用按钮。

@DecCyclone-我什么时候在TextBox中验证值?是否在LostFocus、textChanged等中?@GuruC-我想,默认情况下,它的
LostFocus
@DecCyclone-是的,但当我单击usercontro中的一些按钮时,它不会被触发l!这就是我在回答中想说的。禁用这些按钮,直到所有数据都有效。@Decyclone-好的,让我们假设你所说的对无效数据有效。现在用户输入有效数据,他没有按tab键,而是单击“保存”按钮。失去焦点不会被调用,所以新值不会更新到数据库中。我说得清楚了吗?