本セッションは 赤間さんのセッションで時間的な都合から紹介しきれなかった WPF と Silverlight の検証機能を解説し グレープシテゖが現在開発中の InputMan for WPF で提供する検証機能をご紹介するセッションです 本セッションはそれぞれの最新バージョンである WPF 3.5 SP1 と Silverlight 3 を前提にした内容となっています 2
検証の基本エラー表示の方法 ValidationRuleを継承したカスタムクラス検証ルールの実行タミングンスタンス単位の検証 InputMan for WPF CTP 3
4
Binding.ValidationRules プロパテゖ ValidationRule クラス Validation.Errors 添付プロパテゖ ValidationError クラス 検証は ValidationRules プロパテゖに設定された ValidationRule に基づいて行われる 検証エラーの場合には Errors 添付プロパテゖに ValidationError が追加される 5
実際には他のクラス (Canvas) で定義されているプロパテゖに 各クラス (Button) がそれぞれ別の値を指定できる <Canvas> <Button Canvas.Top="50" Canvas.Left="50" Content=" ボタン "/> </Canvas> 6
ルールは大きく分けると 3 つ ExceptionValidationRule ( 例外ベースの入力検証 ) DataErrorValidationRule (IDataErrorInfo 入力検証 ) ValidationRule を継承したカスタムクラス WPF Silverlight - - 7
簡略記法 Text="{Binding Name, ValidatesOnDataErrors=True}" <TextBox> <TextBox.Text> <Binding Path="Name"> <Binding.ValidationRules> <DataErrorValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> 8
ErrorContent プロパテゖ エラーメッセージを取得します Exception プロパテゖ 検証エラーの原因となった例外を取得します 9
Binding オブジェクト Customer オブジェクト <Binding.ValidationRules> <DataErrorValidationRule/> </Binding.ValidationRules> 12345 TextBox の Validation.Errors 添付プロパテゖに ValidationError が追加される Validation.Errors 添付プロパテゖ 10
11
ErrorTemplate 添付プロパテゖ ValidationStates (VisualStateGroup) HasError 添付プロパテゖ ベント WPF Silverlight - - WPF 4 で追加? Validation.Error 添付ベント FrameworkElemen t.bindingvalidation Error ベント 12
Validation.ErrorTemplate(ControlTemplate 型 ) デフォルトの ErrorTemplate <Validation.ErrorTemplate> <ControlTemplate> <Border BorderBrush="#FFFF0000" BorderThickness="1,1,1,1"> <AdornedElementPlaceholder /> </Border> </ControlTemplate> </Validation.ErrorTemplate> AdornedElementPlaceholder は ErrorTemplate が適用される要素 ( 今回の場合 TextBox) を表す 13
@IT 第 4 回 動的な外観状態と その外観状態に遷移する条件や遷移にかかる時間を管理する一連の機能を提供するのが VSM Button コントロールの Pressed という VisualState は ボタンが押された時の状態 Pressed という名称で 背景色が赤に遷移する VisualState を定義した場合 そのボタンは押された時だけ赤色に変化する WPF/Silverlight UIフレームワーク入門 見た目 を決めるコントロール テンプレート http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_03.html 14
VisualState Valid InvalidFocused InvalidUnfocused 説明コントロールが有効です フォーカスがある状態で コントロールが無効です フォーカスがない状態で コントロールが無効です 15
Validation.HasError ValidationError が存在する場合は True <Style TargetType="TextBox"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> <Setter Property="Background" Value="Red"/> </Trigger> </Style.Triggers> </Style> 16
WPF Validation.Error 添付ベント Silverlight FrameworkElement.BindingValidationError ベント ValidationError が追加 / 削除された際に発生するベント Binding.NotifyOnValidationError プロパテゖを True に設定する必要あり 17
ValidationErrorEventArgs.Action プロパテゖ ValidationErrorEventAction.Added 新しい ValidationError オブジェクトが検出された ValidationErrorEventAction.Removed 既存の ValidationError が削除された If e.action = ValidationErrorEventAction.Added Then 検証エラーが発生した時の処理 ElseIf e.action = ValidationErrorEventAction.Removed Then 検証エラーがなくなった時の処理 End If 18
19
ValidationRule クラスを継承し Validate メソッドをオーバーラド Public Class IDValidation Inherits ValidationRule Public Overrides Function Validate(ByVal value As Object, ByVal cultureinfo As System.Globalization.CultureInfo) As System.Windows.Controls.ValidationResult Dim result As ValidationResult If value Is Nothing Then result = New ValidationResult(False, "ID は必須入力項目です ") ElseIf (Regex.IsMatch(value, "^[0-9A-Z]{4}$") = False) Then 20
21
ValidationStep 列挙値 RawProposedV alue ConvertedProp osedvalue UpdatedValue CommittedVal ue 説明 変換が行われる前 変換が行われる前 ソースの更新後 値がソースにコミットされた後 ExceptionValid ationrule DataErrorValid ationrule ValidationRule を継承したカスタムクラス デフォルト 1 不可デフォルト 可不可可 可 1 可可 2 可 1 デフォルト可 2 1 これらの設定値は意味をなさないと思われる 2 Validationメソッドの引数 valueはbindingexpressionオブジェクト 22
23
以下の条件のどちらかを満たしている場合 Binding がグループ化される Binding のソースと BindingGroup を設定した要素の DataContext が同じ Binding の BindingGroupName プロパテゖが BindingGroup の Name と同じ <Grid.BindingGroup> <BindingGroup> <BindingGroup.ValidationRules> <local:objectvalidation/> </BindingGroup.ValidationRules> </BindingGroup> </Grid.BindingGroup> 24
Binding がグループ化されることにより 各 Binding は個別に更新されなくなる 任意のタミングで一気にすべての項目を更新させることが可能 個々の検証をまとめて実行できる 個々 ValidationRule は ValidationStep が RawProposedValue であるもののみが BindingGroup の ValidationRule よりも前に実行される 25
メソッド名 BeginEdit CommitEdit CancelEdit 説明 編集トランザクションを開始します すべての ValidationRule を実行し 成功した場合はバンデゖングソースを更新します 集トランザクションを終了し 保留中の変更を破棄します 26
Private Sub SubmitButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) If LayoutRoot.BindingGroup.CommitEdit() Then MessageBox.Show(" 登録されました ") LayoutRoot.BindingGroup.BeginEdit() End If End Sub Private Sub CancelButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) LayoutRoot.BindingGroup.CancelEdit() LayoutRoot.BindingGroup.BeginEdit() End Sub 27
28
WPF Silverlight の検証は Binding を設定しているプロパテゖに対してのみ使用可能 Windows フォーム Validating ベント Validated ベント CausesValidation プロパテゖ 29
現在グレープシテゖで開発中の 日本仕様の入力支援コンポーネント InputMan の WPF 版 7 種のコントロール GcTextBox( テキスト ) GcMask( マスク ) GcDate( 日付 ) GcNumber( 数値 ) GcDropDownCalculator( カレンダー ) GcDropDownCalendar( 電卓 ) GcValidationIndicator( 検証ンジケータ ) 30
7 種のコンバーター BooleanToVisibilityConverter DateFormatConverter DateTimeDifferenceValueConverter DecimalDifferenceValueConverter MaskFormatConverter NumberFormatConverter ObjectToDateTimeConverter 2 種のコンポーネント GcImeManager(IME マネージャ ) GcValidationManager( 検証マネージャ ) 31
機能検証検証ルール検証ゕクションンジケータ 説明入力コントロールが データソースに連結されている場合 されていない場合 いずれの場合も使用できる検証機能 検証の対象となるコントロールのプロパテゖ 検証タミング 検証ルールを設定して使用 WPF 標準のValidationRuleクラスを継承する検証ルールを計 10 種類提供 入力されたデータの型 書式 値の範囲など 業務ゕプリケーションで使用頻度の高い検証ルールを用意 不正なデータが入力されたときに実行するゕクションを2 種類提供 不正なデータが入力されたときにゕコンを表示するコントロール ゕコンのツールチップにエラーの内容を設定 32
GcValidationmanager クラス ValidationItem 添付プロパテゖ <TextBox x:name="textbox1" im:gcvalidationmanager.validationitem="{staticresource ValidationItem_ID}"/> <im:gcvalidationindicator ElementName="TextBox1"/> <Grid.Resources> <im:validationitem x:key="validationitem_id" x:shared="false" ValidatedProperty="Text"> <im:validationitem.validationrules> <im:regularexpressionrule Expression="^[0-9A-Z]{4}$" ErrorContent="ID は半角英数大文字 4 文字です " /> </im:validationitem.validationrules> </im:validationitem> </Grid.Resources> 33
標準 Validation でも使用可能なルールが 10 種類 検証ルール ValueRule ValueRangeRule InvalidDateInputRule RequiredFieldRule RegularExpressionRule InvalidPairCharRule InvalidTypeRule SurrogateCharRule ExcludeListRule IncludeListRule 説明 入力された値を指定した値と比較する検証 入力された値が指定した範囲内にあるか検証 入力された日付が日付として有効か検証 InputMan の日付コントロール専用 入力された値が空でないことを検証 正規表現を使用して入力された値を検証 カッコなどのペゕとなる文字が両方存在するかどうかを検証 コントロールに入力された値が指定したデータ型に一致するかどうかを検証 サロゲートペゕ文字が入力されていないかどうかを検証 文字列リストに設定した禁止文字列が入力されていないかどうかを検証 文字列リストに設定した文字列のいずれかが入力されているかどうか検証 34
標準 Validation の HasError を監視 Binding オブジェクト Customer オブジェクト 12345 GcValidationManager Errors プロパティ 発生したエラーをマージ GcValidationManager の IncludeBindingValidationResult プロパテゖを True に設定 35
評価していただける方に InputMan for WPF の CTP 版を提供します CTP 版には製品のほかに 以下のものが含まれています 評価ガド (PDF フゔル ) サンプルプロジェクト リリースノート リフゔレンス ( 英語 ) 評価期間は 11 月末日までを予定 36
InputManCTP@grapecity.com 宛にメールを送信ください 追って詳細をご連絡させていただきます たくさんのご参加お待ちしております 37
38