2010-02-19 31 views
2

我已经有一个ItemsControl充满了几十个项目;每个项目都是一个绑定文本框和几个按钮。因为我希望用户能够从文本框中选择文本框,所以按钮的Focusable设置为False。这工作得很好。唯一的问题是,由于文本框没有失去焦点,它们的绑定不会更新源代码,所以按钮后面的代码不能使用正确的值。如果用户点击某些不可聚焦的东西,我该如何让控件失去焦点?

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

回答

1

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

TextBox focusedTextBox = Keyboard.FocusedElement as TextBox; 
    if (focusedTextBox == null) 
     return; 

    BindingExpression textBindingExpr = 
     focusedTextBox.GetBindingExpression(TextBox.TextProperty); 
    if (textBindingExpr == null) 
     return; 

    textBindingExpr.UpdateSource(); 
1

如果性能允许您将这些文本框元素的UpdateSourceTrigger更改为PropertyChanged而不是LostFocus

+0

可能行不通:它是RichTextBox中的一个子类,它支持对文档属性属性更改通知,以便ValueConverter可以解析XAML并将其转换为HTML 。每次击键都无法完成。 –

+0

如果您担心此操作的成本,请通过触发定时器的某些内容来路由属性,并且只有在定时器评估(10ms?100ms?)后,才会实际执行转换。 –