101

非常に単純なWPFアプリケーションがあり、データバインディングを使用して、いくつかのカスタムCLRオブジェクトを編集できます。ユーザーが[保存]をクリックしたときに、入力の検証を入れたいと思っています。ただし、私が読んだすべてのWPFの本は、この問題に実際に専念しているわけではありません。カスタムValidationRulesを作成できるようですが、これは私のニーズには行き過ぎではないかと思います。

だから私の質問はこれです:WPFでユーザー入力を検証するためのベストプラクティスを示す良いサンプルアプリケーションまたは記事がどこかにありますか?

4

6 に答える 6

83

新しい好ましい方法は、IDataErrorInfoを使用することかもしれないと思います

詳細はこちら

于 2008-09-15T15:09:12.527 に答える
24

MS のPatterns & Practices のドキュメントから:

データ検証とエラー報告

多くの場合、ビュー モデルまたはモデルは、データ検証を実行し、データ検証エラーをビューに通知して、ユーザーがエラーを修正できるようにする必要があります。

Silverlight と WPF は、ビュー内のコントロールにバインドされている個々のプロパティを変更するときに発生するデータ検証エラーを管理するためのサポートを提供します。コントロールにデータ バインドされた単一のプロパティの場合、ビュー モデルまたはモデルは、受信した不正な値を拒否して例外をスローすることにより、プロパティ セッター内でデータ検証エラーを通知できます。データ バインディングの ValidatesOnExceptions プロパティが true の場合、WPF と Silverlight のデータ バインディング エンジンは例外を処理し、データ検証エラーがあることを示す視覚的な合図をユーザーに表示します。

ただし、この方法でプロパティを使用して例外をスローすることは、可能な限り避ける必要があります。もう 1 つの方法は、ビュー モデルまたはモデル クラスに IDataErrorInfo または INotifyDataErrorInfo インターフェイスを実装することです。これらのインターフェイスを使用すると、ビュー モデルまたはモデルで 1 つ以上のプロパティ値のデータ検証を実行し、ユーザーにエラーを通知できるようにエラー メッセージをビューに返すことができます。

このドキュメントでは、IDataErrorInfo と INotifyDataErrorInfo を実装する方法について説明しています。

于 2010-12-01T16:54:35.020 に答える
10

個人的には、検証を処理するために例外を使用しています。次の手順が必要です。

  1. データバインディング式に、「ValidatesOnException=True」を追加する必要があります
  2. バインドしているデータオブジェクトに、新しい値が条件を満たしているかどうかを確認するDependencyPropertyChangedハンドラーを追加する必要があります。満たされていない場合は、オブジェクトの古い値に復元し(必要な場合)、例外をスローします。
  3. コントロールに無効な値を表示するために使用するコントロールテンプレートでは、エラー収集にアクセスして例外メッセージを表示できます。

ここでの秘訣は、DependencyObjectから派生したオブジェクトにのみバインドすることです。INotifyPropertyChangedの単純な実装は機能しません。フレームワークにバグがあり、エラー収集にアクセスできません。

于 2008-09-16T04:07:51.190 に答える
3

こちらの記事もチェックしてください。おそらくMicrosoftは、検証の主題をカバーするパターンとプラクティスからEnterprise Library(v4.0)をリリースしましたが、WPFの検証を含めなかった理由を神は知っています。それを適応させました。お役に立てれば!

于 2008-09-15T21:55:36.827 に答える
2

WPF アプリケーション フレームワーク (WAF)のBookLibraryサンプル アプリケーションに興味があるかもしれません。WPF で検証を使用する方法と、検証エラーが存在する場合に [保存] ボタンを制御する方法を示します。

于 2010-07-04T16:38:43.653 に答える
0

ビジネス クラスが UI によって直接使用される場合は、IDataErrorInfo を使用することをお勧めします。これは、ロジックを所有者に近づけるためです。

ビジネス クラスが WCF/XmlWeb サービスへの参照によって作成されたスタブ クラスである場合、IDataErrorInfo を使用したり、ExceptionValidationRule で使用するために Exception をスローしたりしてはなりません。代わりに、次のことができます。

  • カスタム ValidationRule を使用します。
  • WPF UI プロジェクトで部分クラスを定義し、IDataErrorInfo を実装します。
于 2012-07-25T08:13:44.380 に答える