0

请考虑以下示例。请注意,在现实世界中,绑定源很可能是一个数据对象。为了简单起见,我使用 a TextBlock

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel Margin="20">

        <Label>Enter a Name:</Label>
        <TextBox x:Name="txt_Name" Text="{Binding ElementName=display_name, Path=Text, UpdateSourceTrigger=LostFocus}" />

        <Label>The name you entered:</Label>
        <TextBlock x:Name="display_name" />

        <Button x:Name="btn_Save" Click="SaveClick">_Save</Button>

    </StackPanel>
</Window>
Class Window1

    Private Sub SaveClick(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        MessageBox.Show("Saving your name as: " & display_name.Text)
    End Sub

End Class

在上面的示例中,如果我在 中输入名称"Joe"TextBox单击“保存”按钮,TextBlock则会更新LostFocus并正确“保存”数据。一切都很好。

但是,如果我随后输入"Bob"TextBox使用我的访问密钥 (Alt-S) 进行保存,TextBlock则不会更新,因为不会触发LostFocus上的事件。TextBox结果,我的绑定源没有更新,并且"Joe"保存了错误的值(即 )。

在大多数 WPFTextBox数据输入字段中,您需要在LostFocus(not PropertyChanged) 上进行验证;但是,如果在LostFocus使用访问密钥时事件没有触发(因此绑定没有更新),我们如何验证条目?在 WinForms 中我们有ValidatingandValidated事件,但在 WPF 中没有它们。

4

3 回答 3

2

您可以在保存之前手动执行此操作:

txt_Name.GetBindingExpression(TextBox.TextProperty).UpdateTarget();

有点难看,但它的工作原理。

于 2008-11-17T16:35:29.610 回答
1

您还可以在读取值之前更改单击处理程序中的焦点,例如将焦点强制到按钮或另一个文本框

这是另一个“丑陋但有效”的解决方案,如果您有很多控件或不想弄乱它们的绑定表达式,它可能是合适的。

于 2008-11-18T08:23:49.540 回答
1

好吧,如果您对现实世界的场景比这里的人为示例更感兴趣,您可以设置文本框上的绑定以更新数据更改而不是失去焦点,并且数据将在两种场景中保存而没有任何丑陋黑客。唯一的问题(在 Bindings 的 WPF 文档中提到)是这可能会影响应用程序的性能。如果您在任何一种甚至相对较新的机器上运行,您都不会注意到差异(我没有)。

于 2010-04-22T22:15:57.707 回答