我有一个应用程序,其中有很多文本框和一些按钮,例如保存,另存为等。
当用户编辑TextBox时,我必须检查数据库的某个范围,验证范围并更新数据库。
如果用户输入的值有任何错误,那么我不应该让TextBox失去焦点。
我为此使用了LostFocus事件,并且直到最近在我的应用程序中发现错误为止,它都工作正常。
错误:用户在文本框中编辑一个值,然后单击“保存”按钮;不会调用LostFocus事件,因此数据库不会得到更新:(
现在我的问题是我应该在TextBox中使用哪个事件来更新数据库。我尝试了TextChanged事件,但它会针对每个字符进行验证,并使我的应用程序运行缓慢。我为这种应用选择合适的事件感到困惑!
注意:**按钮位于不同的UserControl中!
编辑1:我有一些附加到单击按钮的命令,这些命令在LostFocus之前就已执行!我可以设置优先级,还是在LostFocus之后执行类似附加行为或命令之类的操作!
编辑2:我只是通过禁用一些命令来调试应用程序,我发现在某些情况下,DelegateCommand在LostFocus之前执行,所以我想避免这种情况。我该怎么办?在开发过程中,我感到无法开发纯MVVM应用程序,因此我有点在后面使用一些代码!
最佳答案
通常,将键盘焦点置于控件内通常是不良的UI设计的征兆-迫使用户在控件中的数据固定下来之后才能在UI的任何其他位置键入内容,这对用户非常不利。
就是说,您不应该在这里使用任何事件。您正在尝试使用WPF编写Windows窗体应用程序。您应该编写一个WPF应用程序。
创建一个作为视图逻辑模型的类-即,文本框有一个string
属性,“保存”按钮有一个Command
属性(或更可能是一个RelayCommand
)。将文本框绑定到字符串属性,例如:
<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
因为
UpdateSourceTrigger
是PropertyChanged
,所以每次用户键入字符时,源对象都会得到更新。将按钮绑定到命令属性,例如:
<Button CommandBinding="{Binding SaveCommand}">Save</Button>
实现
CanSave
(如MVVM模式的Josh Smith's基本文章中所述)所需的适当的Save
和RelayCommand
方法,以便在字符串属性有效时启用按钮,在无效时禁用按钮。关于wpf - 应该使用哪个事件从WPF中的TextBox(LostFocus,LostKeyboardFocus等)更新模型?如何在WPF中设置事件优先级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4447645/