2012-04-13 15 views
2

WPF/XAMLの一部のデータ入力フォームの検証ルールを作成しています。私は明示的にフィールドのバインディングに検証ルールを適用することで、私は希望のユーザーエクスペリエンスを得ることができました。以上によりXAMLでBinding.ValidationRulesを適用する簡潔な方法がありますか

<Binding 
     Path="qtyoffset" 
     NotifyOnValidationError="True" 
     ValidatesOnDataErrors="True" 
     UpdateSourceTrigger="PropertyChanged" 
     > 
    <Binding.ValidationRules> 
     <utility:DecimalValidationRule precision="1" /> 
    </Binding.ValidationRules> 
</Binding> 

、フィールドには、すべてのキープレスで検証されています。ユーザーが 'X'を入力すると、フィールドは即座に無効とフラグされ、エラーメッセージが適切な場所に表示され、「コミット」ボタンがすぐに無効になります。ユーザーが小数点の後に2桁を入力したり、2つの小数点を入力したりすると、同じことが起こります。

私の唯一の問題は冗長です。上記のバインディングコードは、すべてのフィールドに提供する必要があり、1つのフィールドに正しくない場合、その1つのフィールドは正しく動作しません。むしろバインディング・パスのみを指定し、それ以外の部分は自動的に追加されます。バインディングごとにNotifyOnValidationError、ValidatesOnDataErrors、およびUpdateSourceTriggerを設定し、バインドするタイプに応じて、特定のデータ型に適切な検証ルールを設定します。または、少なくとも、XAMLで指定した型に従って。

私はJQueryで検証を行う方法について考えています。各入力要素にすべての検証規則を静的にリストするのではなく、いくつかのクラスを設定します。そして、ロード時には、JQueryのDOM検索機能を使用して、特定のクラスセットを持つすべての入力要素を見つけて、適切な検証機能を動的に追加します。

XAMLは、スタイルとセッターを使用して、表示要素のこのような簡潔な構成を提供する非常に良い方法を提供します。しかし、それはバインディングでは機能しません。

妥当な選択肢はありますか?

答えて

3

短い回答:いいえ、実際はありません。あなたは2つのこと行うことができますしかし

  • をあなたは、リソースに

    NotifyOnValidationError="True" 
        ValidatesOnDataErrors="True" 
        UpdateSourceTrigger="PropertyChanged" 
    

入れて、冗長な情報を考慮して、StaticResourceとしてそれらにアクセスして、あなたは変更される可能性ができますこれらのプロパティはすべて1か所にあります。

  • バインドに基づいて自分自身で作成することができます。markup extensionそれははるかに短いXAML宣言をするでしょう。そして、あなたは好き、それを使用することができます。<TextBox Text={local:DecimalBinding Path=qtyoffset} />

HTH、

バブ。

+0

カスタムマークアップ拡張機能は非常にうまく機能します。ありがとう。 –

0

これはおそらくあなたのニーズには過剰ですが、WPF UserControlをサブクラス化し、UserControlがロードされたときに関数を記述し、新しいバインディングが適用されたときにビジュアルツリーを歩く関連するタイプのバインディングを探し、それらにバリデーションを適用します。

関連する問題