0

双方向バインディングはうまく機能しますが、TextBox の場合、コントロールがフォーカスを失ったときに発生します。

私の場合、1 つの TextBox と送信/キャンセル ボタンを備えたシンプルな UI があります。

ビューのデフォルトとして設定された送信ボタン。したがって、ユーザーはテキストボックスにテキストを入力して「Enter」を押すと、Submit のコマンドが呼び出されます。これは良いことですが、TextBox から値にアクセスする必要があり、TextBox がフォーカスを失っていないため、VM にはありません。このビンギングをコードから強制的に更新するにはどうすればよいですか?

<TextBox
    Text="{Binding Comment, Mode=TwoWay}"
    Grid.Row="2"/>

<StackPanel
    Grid.Row="3"
    HorizontalAlignment="Right"
    Orientation="Horizontal">
    <Button 
        Padding="20,5"
        Margin="5"
        Command="{Binding CancelCommand}"
        Content="Cancel" IsCancel="True" />
    <Button 
        Padding="20,5"
        Margin="5"
        Command="{Binding SubmitCommand}"
        Content="Submit" IsDefault="True" />
</StackPanel>
4

3 に答える 3

2

TextBoxバインディングでUpdateSourceTrigger=PropertyChangedを使用します。

于 2012-08-28T18:45:07.237 に答える
1

UpdateSourceTrigger = PropertyChangedにより、キーストロークごとにソースが更新されます。これが最も簡単なアプローチです。ソースをそれほど頻繁に更新したくない、または更新する必要がない場合は、次のコードを実行して強制的に更新することもできます。

        BindingExpression expression = TextBoxDescription.GetBindingExpression(TextBox.TextProperty);
        expression.UpdateSource();
于 2012-08-28T19:01:02.603 に答える
0

キーを押すたびにではなく、送信ボタンを押した後にVMを更新する場合は、ビューでBindingGroupを使用できます。次に、コマンドハンドラーで、最初にBindingGroup.Commitを呼び出し、次にVMのsubmitメソッドを呼び出します。これは通常のVMRelayCommandではうまく機能しませんが、この機能をカプセル化するために、私がスティッキーコマンドと呼ぶものを作成することができます。

スティッキーコマンドは、アタッチされたプロパティを介してXAMLのビューにアタッチされ、コマンドハンドラーを登録し、リフレクションを使用してVM上のメソッドを呼び出すように構成された小さなコンポーネントです。必要に応じて、 http://wpfglue.wordpress.comでそれを読むことができます。

于 2012-08-28T19:02:45.770 に答える