【问题标题】:WPF Validate/Setter calls in wrong orderWPF Validate/Setter 调用顺序错误
【发布时间】:2015-09-29 20:33:19
【问题描述】:

我在 TabControl 中有一个文本框。文本框绑定具有 UpdateSourceTrigger=LostFocus。文本框使用数据模型中基于属性的验证。此验证工作正常。

在 TabControl.SelectedItemChanged 事件中,我调用 modelObject.Validate() 并防止在发生错误时切换到不同的选项卡。 我遇到的问题是执行顺序是倒退的。验证调用发生在属性设置器之前。在无效字段的情况下,即使检测到错误,我也可以从选项卡中切换出来。

我如何正确地获得订单或这些事件?

【问题讨论】:

    标签: c# wpf validation


    【解决方案1】:

    Is there a way to cancel TabControl.Items.CurrentChanging?

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8ac2677-b760-4388-a797-b39db84a7e0f/how-to-cancel-tabcontrolselectionchanged?forum=wpf

    似乎可以通过订阅 CurrentChanging 事件来工作。可以通过将 CurrentChangingEventArgs Cancel 设置为 true 来取消选项卡更改操作

    【讨论】:

    • 这不是我的问题——我知道如何取消选择更改事件。我想知道如何让 WPF 以正确的顺序对 textbox.lostfocus 和 tabcontrol.Selectionchanged 事件进行排序。即失去焦点然后选择改变 - 不是相反。
    • CurrentChanging 事件发生在 SelectionChanged 事件之前。您可以在处理程序处做任何您想做的事情,例如如果您愿意,可以将焦点切换到文本框以外的任何控件。但问题是......当我看到你的问题时......不是你想要执行的文本框的“验证”吗?验证执行是否来自 LostFocus 真的不是关键吗?
    【解决方案2】:

    WPF 在这里肯定是不正确的。但是,修复非常简单。 在 SelectionChanged 事件处理程序中调用{无论您的 tabcontrol 被调用什么}.Focus()。这会立即强制文本框的 lostfocus 事件(强制触发 setter)并解决问题。

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多