【问题标题】:How can I make a control lose focus if the user clicks on something that's not focusable?如果用户单击不可聚焦的东西,如何使控件失去焦点?
【发布时间】:2010-02-19 19:14:38
【问题描述】:

我有一个 ItemsControl,里面有几十个项目;每个项目都是一个绑定的文本框和几个按钮。因为我希望用户能够从文本框切换到文本框,所以按钮将 Focusable 设置为 False。这工作得很好。唯一的问题是,由于文本框没有失去焦点,它们的绑定没有更新源代码,因此按钮后面的代码无法使用正确的值。

我可以想办法解决这个问题,例如让按钮的 Click 处理程序在逻辑树中导航到其关联的文本框,并使绑定显式更新源。但在我看来,必须有比这更好的方法,如果我对焦点模型有更好的理解,这对我来说可能是显而易见的。有吗?

【问题讨论】:

    标签: c# wpf binding focusable


    【解决方案1】:

    由于性能是一个问题,您可能会发现article written by Josh Smith 很有用。上下文与您的问题非常相似。 Josh 通过手动触发绑定更新来解决它:

        TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
        if (focusedTextBox == null)
            return;
    
        BindingExpression textBindingExpr = 
          focusedTextBox.GetBindingExpression(TextBox.TextProperty);
        if (textBindingExpr == null)
            return;
    
        textBindingExpr.UpdateSource();
    

    【讨论】:

      【解决方案2】:

      如果性能允许,您可以将这些 TextBox 元素的 UpdateSourceTrigger 更改为 PropertyChanged 而不是 LostFocus

      【讨论】:

      • 可能不起作用:它是 RichTextBox 的子类,支持 Document 属性上的属性更改通知,以便 ValueConverter 可以解析 XAML 并将其转换为 HTML。我看不到每次击键时都这样做。
      • 如果您担心此操作的成本,请通过触发计时器的东西路由属性,并且只有在计时器评估(10ms?100ms?)之后才真正进行转换。
      猜你喜欢
      • 1970-01-01
      • 2014-02-09
      • 2020-08-16
      • 2013-06-12
      • 2016-08-10
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多