2

WPF/XAMLの一部のデータ入力フォームの検証ルールに取り組んでいます。フィールドバインディングに検証ルールを明示的に適用することで、希望するユーザーエクスペリエンスを得ることができました。

<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は、スタイルとセッターを使用して、表示要素にこの種の簡潔な構成を提供する非常に優れた方法を提供します。しかし、それはバインディングでは機能しません。

合理的な代替案はありますか?

4

2 に答える 2

3

簡単な答え:いいえ、そうではありません。

ただし、次の2つのことができます。

  • あなたが置くことができます

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

リソースにアクセスし、としてそれらにアクセスしてStaticResource、冗長な情報を除外します。そうすれば、これらのすべてのプロパティを1か所で変更できます。

  • バインディングに基づいて独自のマークアップ拡張機能を作成できます。これにより、XAML宣言がはるかに短くなります。そして、あなたはそれを次のように使うことができます: <TextBox Text={local:DecimalBinding Path=qtyoffset} />

HTH、

バブ。

于 2012-04-13T16:05:41.197 に答える
0

これはおそらくあなたのニーズにはやり過ぎでしょうが、あなたができることの1つは、WPF UserControlをサブクラス化し、UserControlがロードされたとき、および新しいバインディングが適用されたときに、ビジュアルツリーをウォークダウンしてのバインディングを探す関数を作成することです。関連するタイプと検証をそれらに適用します。

于 2012-04-13T16:09:35.090 に答える