0

次の例を検討してください。実際には、バインディングソースはデータオブジェクトである可能性が高いことに注意してください。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ないため、は更新されません。その結果、バインディングソースが更新されず、間違った値(つまり、)が保存されます。LostFocusTextBox"Joe"

ほとんどのWPFデータ入力フィールドでは、検証を(ではなく)TextBox実行する必要があります。ただし、アクセスキーが使用されたときにイベントが発生しない(したがってバインディングが更新されない)場合、エントリを検証するにはどうすればよいですか?WinFormsにはとイベントがありますが、WPFにはありません。LostFocusPropertyChangedLostFocusValidatingValidated

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 に答える