1

データ検証を備えた WPF MVVM データ フォーム ウィンドウがあります。コントロールの多くはテキスト ボックスです。現在、データ バインディング トリガーはデフォルト、つまりフォーカスの喪失に設定されています。これは、フィールドが完全に入力される可能性が高い場合にのみフィールドが検証されることを意味します。そのため、数値を削除して別の数値を入力すると、一時的な空の値が入力エラーとして表示されなくなります。

ただし、欠点は、フォーカスがテキスト ボックスの外に移動した場合にのみ [保存] ボタンを有効にできることです。(どこにいても、編集されたコントロールのすぐ外です。他にフォーカス可能なものがあると仮定します。) これが唯一の変更である場合、ユーザーは [保存] ボタンが使用可能になるのを待っても何も起こりません。[保存] ボタンについては、即時バインディング トリガーを使用したいと思います。どうすればそれができますか?

編集:私の [保存] ボタン (ICommand を使用) は、入力が変更されて有効であると判断された場合にのみ有効になることを忘れていました。そのため、データ バインディングによって更新されるまでデータは変更されず、フォーカスが別のコントロールに移動するまで変更されません。

4

3 に答える 3

1

私は実際にしばらく前に同様の質問DependencyPropertyをしましたが、使用を終了した解決策は、キーが押されたときにタイマーを開始し、PropertyChange特定の時間が経過した場合にのみ実際に通知を処理するカスタムでした.

これは、ユーザーが一定時間入力を停止しない限り、バインドされたプロパティが更新 (および検証) されないことを意味します。

コードはここにあります(少しクリーンアップが必要な場合があります)。これは次のように使用されます。

<TextBox
    local:DelayedUpdateBehavior.TargetProperty="{x:Static TextBox.TextProperty}"
    local:DelayedUpdateBehavior.Milliseconds="1000"
    Text="{Binding MyTextProperty, UpdateSourceTrigger=Explicit}" />

編集:実際には、このリンクの方が良いかもしれません。これはマークアップ拡張機能であるため、バインディングから直接使用できます。過去に使用したこれら2つの方法のどちらを思い出せませんが、それらの1つであったことは知っています:)

<TextBox Text="{local:DelayBinding Path=MyTextProperty, Delay='00:00:01'}" />
于 2012-07-19T13:30:20.497 に答える
0

ボタン クリック イベントに ICommand タイプのインターフェイスを使用しているとします。

できること... INotifyPropertyChanged を使用して文字列プロパティを実装し、それらをテキスト ボックス コントロールにバインドします。Command canexecute メソッドで、プロパティが !nullorempty かどうかを確認できます。

e/文法

于 2012-07-19T12:29:27.670 に答える
-1

Binding のUpdateSourceTriggerプロパティを に設定しますPropertyChanged。TextBoxes のデフォルトは ですLostFocus

更新: TextBox でデータ バインディングを機能させ、数値のみを許可したいですか? この質問を見てください:数値のみを受け入れる WPF TextBox を作成する

または、コンバーターを使用して [保存] ボタンの IsEnabled プロパティを TextBox にバインドし (複数ある場合は MultiBinding を使用する可能性があります)、テキストが有効な数値であるかどうかを判断し、true または false を返すコンバーターを使用します。

于 2012-07-19T09:48:39.113 に答える