【问题标题】:Which event should be used to update a Model from TextBox (LostFocus, LostKeyboardFocus, etc) in WPF? How to set precedence of events in WPF?应该使用哪个事件从 WPF 中的 TextBox(LostFocus、LostKeyboardFocus 等)更新模型?如何在 WPF 中设置事件的优先级?
【发布时间】:2010-12-15 07:27:12
【问题描述】:

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

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

我为此使用了 LostFocus 事件,它运行良好,直到最近我在我的应用程序中发现了一个错误。

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

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

注意 :** Buttons 在不同的 UserControl 中!

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

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

【问题讨论】:

    标签: wpf events textbox updatemodel lostfocus


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • @Decyclone - 我什么时候验证 TextBox 中的值?是在 LostFocus、textChanged 等中吗?
      • @GuruC - 我认为默认情况下它是LostFocus
      • @Decyclone - 是的,但是当我点击用户控件中的某些按钮时它不会被触发!
      • 这就是我在回答中想说的。禁用这些按钮,直到您的所有数据都有效为止。
      • @Decyclone - 好吧,让我们说一下你所说的适用于 InvalidData。现在用户输入了一个有效的数据并且他没有按标签,他点击了保存按钮。不会调用丢失的焦点,因此不会将新值更新到数据库。我说清楚了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多