SlideShare a Scribd company logo
1 of 77
Download to read offline
VSUG DAY 2010 Winter

60分でわかる!
SilverlightとWPFの
入力チェック
グレープシティ株式会社
    八巻 雄哉
“入力チェック”とは

 UIが受け取ったユーザー入力の妥当性を
 検証し、結果に応じて何らかの
 アクションをとること
  ユーザー入力後、コントロールに保持されて
  いる入力値を検証し、結果に応じてユーザー
  への通知を行うというアクションをとる




         VSUG DAY 2010.12.11   2
検証とアクション


検証                     アクション
 TextBoxに入力された            メッセージをToolTipで
 値が数値かどうかを                表示する
 確認する




            VSUG DAY 2010.12.11            3
60分でわかる!SilverlightとWPFの入力チェック

検証


              VSUG DAY 2010.12.11   4
WPF/Silverlightの検証

 WPF/Silverlightでは、
 データバインディングのプロセスの1つ
 として検証機能が提供されている

                                        データ
    UI要素       バインディング
                                       オブジェクト
                オブジェクト

   依存関係
               検証             変換       プロパティ
   プロパティ


バインディングターゲット                         バインディングソース
               VSUG DAY 2010.12.11                5
本セッションのデモを図解

 abc@




                                        Customer
    TextBox    バインディング
                                       オブジェクト
                オブジェクト
    Text                               AccountName
   プロパティ                                プロパティ
                      検証
    abc@                                abc@

バインディングターゲット                         バインディングソース
               VSUG DAY 2010.12.11                   6
検証処理実装方法の種類

                                                                    Windows
                                          WPF 4     Silverlight 4   Phone OS
                                                                       7.0
    ValidationRuleを継承した
①                                           ✔            -             -
    カスタムクラス
  Exception(例外)によるエラー通知
②   ExceptionValidationRule                 ✔            -             -
    ValidatesOnExceptions                   ✔            ✔             ✔
  IDataErrorInfoによるエラー通知
③   DataErrorValidationRule                 ✔            -             -
    ValidatesOnDataErrors                   ✔            ✔             -
    INotifyDataErrorInfoによるエラー通知
④
      ValidatesOnNotifyDataErrors               -        ✔             -

ValidatesOn***プロパティをTrueに設定した場合、***ValidationRuleを
設定したときと同じ動作となる。 Silverlight 4/Windows Phone OS 7.0には
ValidationRulesプロパティが存在しないため、 必ずValidatesOn***を使用する。

                          VSUG DAY 2010.12.11                                  7
ValidationRulesプロパティ使用

<TextBox>
  <TextBox.Text>
    <Binding Path="AccountName">
      <Binding.ValidationRules>
        <ExceptionValidationRule/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
    WPF 4
                VSUG DAY 2010.12.11   8
ValidatesOn***プロパティ使用

<TextBox Text="{Binding AccountName, Validat
esOnExceptions=True}"/>




    WPF 4           Silverlight 4     Windows Phone OS 7.0
                VSUG DAY 2010.12.11                          9
2つの検証処理実装場所


                                  ②Exception
                                  ③IDataErrorInfo
①ValidationRule                   ④INotifyDataErrorInfo
 バインディングターゲット                           バインディングソース

        UI要素                            データオブジェクト


      依存関係
                                          プロパティ
      プロパティ



                  VSUG DAY 2010.12.11                     10
①ValidationRule

  WPF 4
          VSUG DAY 2010.12.11   11
①ValidationRule

<Binding Path="AccountName">
  <Binding.ValidationRules>
    <local:AccountNameValidationRule/>
  </Binding.ValidationRules>
</Binding>
     WPF 4
                    バインディング
    TextBox          オブジェクト               Customer

                カスタムValidationRule
    Text                                 AccountName
   プロパティ       ValidationResultを返す        プロパティ



                   VSUG DAY 2010.12.11                 12
カスタムValidationRule

class AccountNameValidationRule : ValidationRule
{
   public override ValidationResult Validate(object value, System.Glob・・・
   {
     if (string.IsNullOrEmpty((string)value))
     {
        return new ValidationResult(false, "必須入力項目です。");
     }
     else if (!Regex.IsMatch((string)value, "^[0-9A-Za-z]{5,12}$"))
     {
        return new ValidationResult(false, "半角英数字5 文字以上12文字以下で入力
してください。");
     }
     return ValidationResult.ValidResult;
   }
}
        WPF 4
                           VSUG DAY 2010.12.11                              13
①ValidationRule

DEMO


                  VSUG DAY 2010.12.11   14
②Exception

 WPF 4       Silverlight 4     Windows Phone OS 7.0
         VSUG DAY 2010.12.11                          15
②Exception

<TextBox Text="{Binding AccountName, ValidatesOnExceptions=
True}"/>




      WPF 4                Silverlight 4       Windows Phone OS 7.0

                        バインディング
     TextBox             オブジェクト                    Customer

                  ValidatesOnExceptions=True     AccountName
     Text                                         プロパティ
    プロパティ                                            検証処理
                                      例外をスロー


                       VSUG DAY 2010.12.11                            16
Exception(例外)によるエラー通知

public string AccountName
{
  get { return _accountName; }
  set
  {
    if (string.IsNullOrEmpty((string)value))
    {
       throw new Exception("必須入力項目です。");
    }
    else if (!Regex.IsMatch((string)value, "^[0-9A-Za-z]{5,12}$"))
    {
       throw new Exception("半角英数字5文字以上12文字以下で入力して
ください。");
    }
    _accountName = value;
  }
}         WPF 4                    Silverlight 4         Windows Phone OS 7.0
                             VSUG DAY 2010.12.11                                17
②Exception

DEMO


             VSUG DAY 2010.12.11   18
System.ComponentModel.
DataAnnotations名前空間
 WPF 4       Silverlight 4
         VSUG DAY 2010.12.11   19
ValidationException(検証例外)

 デバッグ実行で中断しない設定
 (Visual Studio 2010既定)




             VSUG DAY 2010.12.11   20
検証属性を利用した検証処理

                                                         カスタムの検証属性
                            CustomValidationAttribute

                                                         DataType列挙体に用意された
ValidationAttribute(検証属性)




                                DataTypeAttribute
                                                         データ型(電話番号など)を指定

                                                         特定の列挙体を指定し、値が含まれ
                             EnumDataTypeAttribute
                                                         ることを保証

                                                         最小値および最大値の制約を指定
                                 RangeAttribute


                            RegularExpressionAttribute   正規表現を使用して有効な値を指定


                                RequiredAttribute        値が必須であることを指定


                              StringLengthAttribute      最大文字数および最小文字数を指定


                                            VSUG DAY 2010.12.11              21
Validatorクラス

 検証属性を使用するためのヘルパークラス
   ValidatePropertyメソッド
     指定されたプロパティの値が有効であるかどうか
     を判断し、プロパティが有効でない場合は、
     ValidationExceptionをスローします。




               VSUG DAY 2010.12.11   22
検証属性を使用して例外をスロー

[Required(ErrorMessage = "必須入力項目です。")]
[RegularExpression(@"^[0-9A-Za-z]{5,12}$", ErrorMessage = "
半角英数字5文字以上12文字以下で入力してください。")]
public string AccountName
{
    get { return _accountName; }
    set
    {
       Validator.ValidateProperty(value, new ValidationContext(th
is, null, null) { MemberName = "AccountName" });
       _accountName = value;
    }
}



       WPF 4                Silverlight 4
                        VSUG DAY 2010.12.11                         23
②Exception + 検証属性

DEMO


                VSUG DAY 2010.12.11   24
③IDataErrorInfo

  WPF 4       Silverlight 4
          VSUG DAY 2010.12.11   25
③IDataErrorInfo

<TextBox Text="{Binding AccountName, ValidatesOnDataErrors=
True}"/>




      WPF 4                Silverlight 4

                        バインディング
     TextBox             オブジェクト                 Customer

                  ValidatesOnDataErrors=True   AccountName
     Text                                       プロパティ
    プロパティ
                          検証エラーメッセージ           Itemプロパティ
                          (String)を返す


                       VSUG DAY 2010.12.11                    26
IDataErrorInfoのメンバー

 Errorプロパティ
   オブジェクトの検証エラーを説明する文字列
   を取得。エラーが存在しない場合はnull参照。
 Itemプロパティ(インデクサ)
   指定されたプロパティの検証エラーを説明す
   る文字列を取得。エラーが存在しない場合は
   null参照。




             VSUG DAY 2010.12.11   27
サンプルコード( IDataErrorInfo )

public string this[string columnName]
{
  get
  {
      switch (columnName)
      {
         case "AccountName":
            if (string.IsNullOrEmpty(AccountName))
            {
                return "必須入力項目です。";
            }
            else if (!Regex.IsMatch(AccountName, "^[0-9A-Za-z]{5,12}$"))
            {
                return "半角英数字5文字以上12文字以下で入力してください。";
            }
            break;
      }
      return null;
  }
}
        WPF 4                    Silverlight 4
                            VSUG DAY 2010.12.11                            28
③IDataErrorInfo

DEMO


                  VSUG DAY 2010.12.11   29
Validatorクラス
(System.ComponentModel.DataAnnotations名前空間)


  検証属性を使用するためのヘルパークラス
     ValidatePropertyメソッド
       指定されたプロパティの値が有効であるかどうか
       を判断し、値が有効でない場合は
       ValidationExceptionをスローします。
     TryValidatePropertyメソッド
       指定されたプロパティ値が有効であるかどうかを
       判断し、値が有効な場合はTrue、そうでない場合
       はFalseを返します。




                     VSUG DAY 2010.12.11      30
検証属性を使用して判定

public string this[string columnName]
{
  get
  {
      var results = new List<ValidationResult>();
      if (Validator.TryValidateProperty(
          GetType().GetProperty(columnName).GetValue(this,
          null), new ValidationContext(this, null, null)
          { MemberName = columnName }, results))
      {
          return null;
      }
      return results.First().ErrorMessage;
  }
}
      WPF 4                Silverlight 4
                       VSUG DAY 2010.12.11                   31
③IDataErrorInfo + 検証属性

DEMO


                 VSUG DAY 2010.12.11   32
④INotifyDataErrorInfo

             Silverlight 4
         VSUG DAY 2010.12.11   33
④INotifyDataErrorInfo

<TextBox Text="{Binding AccountName, ValidatesOnNotifyDataE
rrors=True}"/>                            既定でTrue




                             Silverlight 4

                         バインディング
     TextBox              オブジェクト                        Customer

                  ValidatesOnNotifyDataErrors=True    AccountName
     Text                                              プロパティ
    プロパティ
                            検証エラー情報の                    GetErrors
                            コレクションを返す                   メソッド
                                                     ErrorsChangedイベント
                        VSUG DAY 2010.12.11                          34
INotifyDataErrorInfoのメンバー

 GetErrorsメソッド
   指定されたプロパティの検証、およびオブジェクト
   の検証におけるエラー情報(複数可)を取得。エ
   ラーが存在しない場合はnull参照。

 HasErrorsプロパティ
   オブジェクトの検証エラーの有無をBoolean値として
   取得

 ErrorsChangedイベント
   プロパティまたはオブジェクト全体の検証エラーが
   変更されたときに発生

              VSUG DAY 2010.12.11   35
DataErrorInfoの優位点

 1つの項目で複数の検証エラーを返せる
 エラー内容として文字列(String)以外の
 情報を設定可能(①も可)
 データバインディングによる値の更新
 に同期せず、任意のタイミングで検証
 可能




             VSUG DAY 2010.12.11   36
INotifyDataErrorInfoの実装例

public System.Collections.IEnumerable GetErrors(string property
Name)
{
   var results = new List<ValidationResult>();
   if (Validator.TryValidateProperty(
       GetType().GetProperty(propertyName).GetValue(this, null),
       new ValidationContext(this, null, null) { MemberName = p
ropertyName },
       results))
   {
       return null;
   }
   return results;
}


                           Silverlight 4
                       VSUG DAY 2010.12.11                         37
ErrorsChangedイベントの発行

public string AccountName
{
  get { return _accountName; }
  set
  {
      // 実際にはここで非同期処理でサーバー側で値を検証し
      // ErrorsChangedイベントを発行する
      RaiseErrorsChanged("AccountName");

        _accountName = value;
    }
}




                            Silverlight 4
                        VSUG DAY 2010.12.11   38
④INotifyDataErrorInfo + 検証属性

DEMO


                  VSUG DAY 2010.12.11   39
60分でわかる!SilverlightとWPFの入力チェック

アクション



              VSUG DAY 2010.12.11   40
検証エラー発生時に何が起こるのか?

 その検証エラーに対応したValidationError
オブジェクトが作成され、バインドされている
  要素のValidation.Errors添付プロパティ
(読み取り専用のコレクション)に追加される

ValidationErrorクラス
  ErrorContentプロパティ
   エラーメッセージを取得
  Exceptionプロパティ
   検証エラーの原因となった例外を取得


           VSUG DAY 2010.12.11   41
本セッションのデモを図解


  Validation.Errors添付プロパティ
   ValidationErrorオブジェクト
   “5文字以上12文字以下です。”
   ValidationErrorオブジェクト
   “半角英数字のみ使用できます。”

                                           Customer
    TextBox          バインディング
                                          オブジェクト
                      オブジェクト
    Text                                  AccountName
   プロパティ                                   プロパティ
                         検証
    abc@                                   abc@

バインディングターゲット                            バインディングソース
                  VSUG DAY 2010.12.11                   42
検証アクション実装方法の種類

   Validation.Errors添付プロパティの値に
   応じて、各種検証アクションのための仕
   組みが動作する
                            WPF                Silverlight             Windows
                                                                     Phone OS 7.0
a. ErrorTemplate               ✔                      -                        -
b. ValidationStates            ✔                     ✔                        ✔
                      既定ではVisualStateは定義                               既定で定義されている
(VSM)                    されていない                                         VisualStateは空

c. HasError
                               ✔                     ✔                        ✔
添付プロパティ
(プロパティトリ
                               ✔                      -                        -
ガー)
                               ✔                     ✔                        ✔
d. イベント                  Validation.Error   FrameworkElement.Bindi   FrameworkElement.Bindi
                          添付イベント            ngValidationErrorイベント    ngValidationErrorイベント


                              VSUG DAY 2010.12.11                                             43
a. ErrorTemplate添付プロパティ


 WPF 4
         VSUG DAY 2010.12.11   44
a. ErrorTemplate添付プロパティ

 Validation.Errors添付プロパティの値が
 空でない(検証条件に対して無効な値が
 設定されている)場合に、
 ErrorTemplate添付プロパティに設定さ
 れたテンプレート(外観)が表示される




            VSUG DAY 2010.12.11   45
a. ErrorTemplate添付プロパティ

   Validation.ErrorTemplate(ControlTemplate型)
デフォルトのErrorTemplate
<Validation.ErrorTemplate>
  <ControlTemplate>
    <Border BorderBrush="#FFFF0000" BorderThickness="1,1,1,1">
       <AdornedElementPlaceholder />
    </Border>
  </ControlTemplate>
</Validation.ErrorTemplate>
       WPF 4

   AdornedElementPlaceholderはErrorTemplateが
   適用される要素(今回の場合TextBox)を表す
                       VSUG DAY 2010.12.11                       46
a. ErrorTemplate添付プロパティ

DEMO


                VSUG DAY 2010.12.11   47
b. VisualStateManager(VSM)


  WPF 4       Silverlight 4     Windows Phone OS 7.0
          VSUG DAY 2010.12.11                          48
b. VisualStateManager(VSM)

    動的な外観状態と、その外観状態に遷移する
    条件や遷移にかかる時間を管理する一連の機能
    を提供するのがVSM
    ValidationStates(VisualStateGroup)
Errors添付      VisualState         説明
プロパティ
空             Valid               コントロールが有効
              InvalidFocused      フォーカスがある状態で、コントロールが
                                  無効
空でない
              InvalidUnfocused フォーカスがない状態で、コントロールが
                               無効

“見た目”を決めるコントロール・テンプレート - @IT
http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_03.html
                             VSUG DAY 2010.12.11                                49
VSMの優位点

 値が無効な場合だけでなく、値が有効な
 場合の外観も定義できる
 外観への遷移方法(VisualTransition)を
 定義できる

 難点
  Expression Blendがないとちょっとキツイ




          VSUG DAY 2010.12.11   50
b. VisualStateManager(VSM)

DEMO


                  VSUG DAY 2010.12.11   51
c. HasError添付プロパティ


 WPF 4       Silverlight 4     Windows Phone OS 7.0
         VSUG DAY 2010.12.11                          52
c. HasError添付プロパティ(プロパティトリガー)


  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>
      WPF 4
                        VSUG DAY 2010.12.11                        53
Silverlightのドキュメントより抜粋

 WPFでは、プロパティトリガーによってデータ検証が実
 行される場合があります。その場合、
 Validation.HasErrorは、TriggerのProperty属性値を
 チェックするためのプロパティ条件として使用されます。
 このようなイベントハンドラーは、コード中のオブジェ
 クトのValidation.HasError添付プロパティをチェック
 することができますが、通常はGetHasErrorメソッドを
 呼び出すか、またはHasErrorProperty識別子を使用し
 て GetValue メソッドを呼び出します。
 BindingValidationErrorイベントのハンドラーは、通常、
 検証を行うためにそのロジックの一部として特定の
 VisualStateに変更されます。


              VSUG DAY 2010.12.11            54
d. イベント


 WPF 4        Silverlight 4     Windows Phone OS 7.0
          VSUG DAY 2010.12.11                          55
d. イベント

 WPF 4
   Validation.Error添付イベント
 Silverlight 4/Windows Phone OS 7.0
   FrameworkElement.BindingValidationErrorイベント
 ValidationErrorが追加/削除された際に
                         発生するイベント
 Binding.NotifyOnValidationErrorプロパティを
 Trueに設定する必要あり
 これらのイベントはルーティングイベント
 (バブル)となっているため、親要素の
 イベントハンドラーで通知を受け取ることが可能

                VSUG DAY 2010.12.11              56
d. イベント

   イベントの引数ValidationErrorEventArgsに
   含まれているActionプロパティ
       ValidationErrorEventAction.Added
       新しいValidationErrorオブジェクトが検出された
       ValidationErrorEventAction.Removed
       既存のValidationErrorが削除された
if (e.Action == ValidationErrorEventAction.Added)
{
   // 検証エラーが発生した時の処理
}
else if (e.Action == ValidationErrorEventAction.Removed)
{
   //検証エラーがなくなった時の処理
}
        WPF 4                    Silverlight 4         Windows Phone OS 7.0

                            VSUG DAY 2010.12.11                               57
d. イベント

DEMO


          VSUG DAY 2010.12.11   58
まとめ

検証
 ①    ValidationRule
 ②    Exception
 ③    IDataErrorInfo
 ④    INotifyDataErrorInfo
アクション
 a.   ErrorTemplate添付プロパティ
 b.   VisualStateManager(VSM)
 c.   HasError添付プロパティ(プロパティトリガー)
 d.   イベント


                   VSUG DAY 2010.12.11   59
検証のまとめ図

          ①                 ②                ③              ④
          ValidationRule    Exception        IDataErrorInfo INotifyDataErr
                                                            orInfo
検証処理実装    バインディング           バインディング          バインディング         バインディング
場所        ターゲット             ソース              ソース             ソース
検証属性の利用   -                 ✔                ✔               ✔
文字列以外の    ✔                 -                -               ✔
検証エラー内容
複数の検証     -                 -                -               ✔
エラー通知
任意のタイミン   -                 -                -               ✔
グで検証
利用可能プラッ   WPF 4             WPF 4            WPF 4
トフォーム                       Silverlight 4    Silverlight 4   Silverlight 4
                            Windows Phone




                           VSUG DAY 2010.12.11                               60
アクションのまとめ図

          a.               b.               c.                 d.
          ErrorTemplate    VisualStateMa    HasError添付プ        イベント
          添付プロパティ          nager(VSM)       ロパティ(プロパ
                                            ティトリガー)
サポートされる                    有効               有効                 有効
検証結果      無効               無効(フォーカス有)       無効                 無効
                           無効(フォーカス無)                          ※フォーカス対応化
アクションの記   XAML             XAML             XAML               コード
述                                           (コードの場合
                                            GetHasErrorメソッド)

遷移アニメー    -                ✔                ✔
ションサポート
対象コントロー   -                -                ✔                  ✔
ルと無関係の要
素の外観を変更
利用可能プラッ   WPF 4            WPF 4            WPF 4              WPF 4
トフォーム                      Silverlight 4    Silverlight 4      Silverlight 4
                           Windows Phone    Windows Phone      Windows Phone



                          VSUG DAY 2010.12.11                              61
“入力チェック”とは

 UIが受け取ったユーザー入力の妥当性を
 検証し、結果に応じて何らかの
 アクションをとること
  ユーザー入力後、コントロールに保持されて
  いる入力値を検証し、結果に応じてユーザー
  への通知を行うというアクションをとる
  ユーザー入力時に入力を検証し、結果に応じ
  てその入力を無効にする/有効な入力に変換
  するというアクションをとる


         VSUG DAY 2010.12.11   62
検証タイミングで異なる開発面の特徴

入力後
  プロパティ値を確認するという
     単純処理であるため、難易度が低い
  様々なケースに対応できる反面、
               汎用化が難しい
入力中
  キー入力に加え、マウス操作、貼り付け、
  カレット制御などを考慮する必要がある
  プリミティブな部分での実装が必要となり
  難易度が高い

        VSUG DAY 2010.12.11   63
InputManファミリー

  日本の業務アプリケーションに求められる
 高度な入力支援機能を提供するコントロール集


      for Silverlight     for WPF




      for Windows
                          for ASP.NET
            Forms
               VSUG DAY 2010.12.11      64
InputMan for Silverlight 1.0J

Silverlight標準に不足している業務コントロールをカバー
  GcTextBox                  テキストコントロール
  GcMask                     マスクコントロール
  GcDateTime                 日付コントロール
  GcNumber                   数値コントロール
  GcDropDownCalculator       ドロップダウン電卓コントロール
  GcDropDownCalendar         ドロップダウンカレンダーコントロール
  GcValidationIndicator      検証インジケータコントロール
  GcImeManager               ふりがな取得コンポーネント

  和暦の表示/入力(M・T・S・Hや元年表示にも対応)
  文字種指定の入力制御(ひらがな、カタカナ、記号、全角、半角、
  スペース、サロゲートペア文字など)
  ノンコーディングでフォーカス制御
  フリガナ自動取得
  祝日の登録や曜日のスタイルを設定できるカレンダー
                          VSUG DAY 2010.12.11     65
GcTextBox.Formatプロパティ

<im:GcTextBox Format="Aa9" />
       WPF 4                       Silverlight 4
  全角    半角     説明
  A     A      大文字のアルファベット(A~Z)
  a     a      小文字のアルファベット(a~z)
  K     K      カタカナ(促音・拗音の小書き表記あり)
  N     N      カタカナ(促音・拗音の小書き表記なし)
  9     9      数字(0~9)
  #     #      数字および数字関連記号(0~9、+ - $ % ¥ , .)
  @     @      記号(! " # $ % & ' ( ) - = ^ ~ ¥ | @ ` [ { ; + : * ] } , < . > / ? _)
  B     B      2進数(0または1)
  X     X      16進数(0~9、A~F)
  J     -      ひらがな(促音・拗音の小書き表記あり)
  G     -      ひらがな(促音・拗音の小書き表記なし)
  Z     -      すべての全角文字
  T     -      サロゲート ペア文字
  S     S      空白文字
  -     H      すべての半角文字
  -     ^      指定した書式に含まれないすべての文字
  -     ¥      エスケープシーケンス

                              VSUG DAY 2010.12.11                                    66
67
Appendix


           VSUG DAY 2010.12.11   68
検証属性の自動適用

         Silverlight 4
     VSUG DAY 2010.12.11   69
検証属性の自動適用

Silverlight 4のDataGrid
  データ注釈を使用したデータ クラスのカスタマイズ
  http://msdn.microsoft.com/ja-jp/library/dd901590.aspx

WCF RIA Services
  How to: Validate Data
  http://msdn.microsoft.com/en-us/library/ee707335.aspx




                     VSUG DAY 2010.12.11                  70
検証ルールの実行タイミング

 WPF 4
         VSUG DAY 2010.12.11   71
ValidationRule.ValidationStepプロパティ

ValidationSt     説明       ExceptionVa DataErrorVa     ValidationR
 ep 列挙値                   lidationRule lidationRule   uleを継承し
                                                      たカスタムク
                                                          ラス
RawPropose 変換が行われ
                            デフォルト              不可     デフォルト
dValue     る前
ConvertedPr 変換が行われ
oposedValu た後                   可              不可         可
e
UpdatedVal     ソースの更新
                                可               可        可※
ue             後
CommittedV 値がソースに
alue       コミットされ               可             デフォルト      可※
           た後

※Validationメソッドの引数valueはBindingExpressionオブジェクト
       WPF 4
                        VSUG DAY 2010.12.11                         72
BindingGroup

  WPF 4
          VSUG DAY 2010.12.11   73
BindingGroupプロパティ

   以下の条件のどちらかを満たしている場合、
   Bindingがグループ化される
      BindingのソースとBindingGroupを設定した要素の
      DataContextが同じ
      BindingのBindingGroupNameプロパティが
      BindingGroupのNameと同じ
<Grid.BindingGroup>
  <BindingGroup>
    <BindingGroup.ValidationRules>
      <local:ObjectValidation/>
    </BindingGroup.ValidationRules>
  </BindingGroup>
</Grid.BindingGroup>
       WPF 4

                           VSUG DAY 2010.12.11   74
個々の検証をまとめて実行

Bindingがグループ化されることにより、
       各Bindingは個別に更新されなくなる。
任意のタイミングで
一気にすべての項目を更新させることが可能

個々の検証をまとめて実行できる。
     個々ValidationRuleは、ValidationStepが
RawProposedValueであるもののみがBindingGroupの
      ValidationRuleよりも前に実行される。



              VSUG DAY 2010.12.11        75
編集トランザクション

メソッド名        説明
BeginEdit    編集トランザクションを開始します。
CommitEdit   すべてのValidationRuleを実行し、
             成功した場合はバインディングソースを更新します。
CancelEdit   編集トランザクションを終了し、保留中の変更を破棄します。




                  VSUG DAY 2010.12.11       76
編集トランザクション

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
      WPF 4
                       VSUG DAY 2010.12.11                      77

More Related Content

What's hot

20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflowTomoyuki Obi
 
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Takakiyo Tanaka
 
Open棟梁 v02-00 コンセプト
Open棟梁 v02-00 コンセプトOpen棟梁 v02-00 コンセプト
Open棟梁 v02-00 コンセプトDaisuke Nishino
 
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)TOSHIO TOJO
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説Daisuke Nishino
 
Windows PowerShell 5.0 と Windows Server vNext の管理
Windows PowerShell 5.0 と Windows Server vNext の管理Windows PowerShell 5.0 と Windows Server vNext の管理
Windows PowerShell 5.0 と Windows Server vNext の管理Kazuki Takai
 
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~Yuya Yamaki
 
【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発西 雄樹
 
PowerShell 5.0 で広がる運用管理の世界
PowerShell 5.0 で広がる運用管理の世界PowerShell 5.0 で広がる運用管理の世界
PowerShell 5.0 で広がる運用管理の世界Kazuki Takai
 
PowerShell 5.0 & Security
PowerShell 5.0 & SecurityPowerShell 5.0 & Security
PowerShell 5.0 & SecurityKazuki Takai
 
Introducing Windows Terminal
Introducing Windows TerminalIntroducing Windows Terminal
Introducing Windows TerminalKazuki Takai
 
Windows Admin Center -Project Honolulu改め-
Windows Admin Center -Project Honolulu改め-Windows Admin Center -Project Honolulu改め-
Windows Admin Center -Project Honolulu改め-Norio Sashizaki
 
XPagesジャンプスタート
XPagesジャンプスタートXPagesジャンプスタート
XPagesジャンプスタートMitsuru Katoh
 
PowerShell の基本操作とリモーティング&v3のご紹介 junichia
PowerShell の基本操作とリモーティング&v3のご紹介 junichiaPowerShell の基本操作とリモーティング&v3のご紹介 junichia
PowerShell の基本操作とリモーティング&v3のご紹介 junichiajunichi anno
 
Interact 2018:PowerShell of Microsoft SDN v2 101
Interact 2018:PowerShell of Microsoft SDN v2 101Interact 2018:PowerShell of Microsoft SDN v2 101
Interact 2018:PowerShell of Microsoft SDN v2 101wind06106
 
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~de:code 2017
 
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
WebSphere Application Server V8.5.5Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51WebSphere Application Server V8.5.5Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51Takakiyo Tanaka
 
Cognos analytics 導入&サンプルセットアップ手順書
Cognos analytics 導入&サンプルセットアップ手順書Cognos analytics 導入&サンプルセットアップ手順書
Cognos analytics 導入&サンプルセットアップ手順書Shinsuke Yamamoto
 

What's hot (20)

20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow
 
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
 
Open棟梁 v02-00 コンセプト
Open棟梁 v02-00 コンセプトOpen棟梁 v02-00 コンセプト
Open棟梁 v02-00 コンセプト
 
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)
最新情報でわかる Windows 10 の導入と展開 (2017/9/19 開催分)
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
Windows PowerShell 5.0 と Windows Server vNext の管理
Windows PowerShell 5.0 と Windows Server vNext の管理Windows PowerShell 5.0 と Windows Server vNext の管理
Windows PowerShell 5.0 と Windows Server vNext の管理
 
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~
Visual Studio 2010でWPF/Silverlightをはじめる5つの理由~業務アプリ開発編~
 
【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発【Xpages day2016】標準コントールを使わないxpage開発
【Xpages day2016】標準コントールを使わないxpage開発
 
PowerShell 5.0 で広がる運用管理の世界
PowerShell 5.0 で広がる運用管理の世界PowerShell 5.0 で広がる運用管理の世界
PowerShell 5.0 で広がる運用管理の世界
 
PowerShell 5.0 & Security
PowerShell 5.0 & SecurityPowerShell 5.0 & Security
PowerShell 5.0 & Security
 
Introducing Windows Terminal
Introducing Windows TerminalIntroducing Windows Terminal
Introducing Windows Terminal
 
Windows Admin Center -Project Honolulu改め-
Windows Admin Center -Project Honolulu改め-Windows Admin Center -Project Honolulu改め-
Windows Admin Center -Project Honolulu改め-
 
XPagesジャンプスタート
XPagesジャンプスタートXPagesジャンプスタート
XPagesジャンプスタート
 
PowerShell の基本操作とリモーティング&v3のご紹介 junichia
PowerShell の基本操作とリモーティング&v3のご紹介 junichiaPowerShell の基本操作とリモーティング&v3のご紹介 junichia
PowerShell の基本操作とリモーティング&v3のご紹介 junichia
 
Interact 2018:PowerShell of Microsoft SDN v2 101
Interact 2018:PowerShell of Microsoft SDN v2 101Interact 2018:PowerShell of Microsoft SDN v2 101
Interact 2018:PowerShell of Microsoft SDN v2 101
 
Cognos10.2.1 install
Cognos10.2.1 installCognos10.2.1 install
Cognos10.2.1 install
 
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~
[MR11] Windows as a Service との付き合い方。~法人向け Windows 10 の新機能や事例もご紹介~
 
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
WebSphere Application Server V8.5.5Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51WebSphere Application Server V8.5.5Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
WebSphere Application Server V8.5.5 Libertyプロファイルのご紹介 #jjug_ccc #ccc_r51
 
Cognos analytics 導入&サンプルセットアップ手順書
Cognos analytics 導入&サンプルセットアップ手順書Cognos analytics 導入&サンプルセットアップ手順書
Cognos analytics 導入&サンプルセットアップ手順書
 
20070310
2007031020070310
20070310
 

Similar to 60分でわかる!SilverlightとWPFの入力チェック

20120507 zendform
20120507 zendform20120507 zendform
20120507 zendformYusuke Ando
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidationTakayoshi Tanaka
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発Kazuki Nakajima
 
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックjQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックJun-ichi Sakamoto
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdkKazuki Nakajima
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Hideki Hashizume
 
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkAtsushi Fukui
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編なべ
 
CouchDB20091120_validation
CouchDB20091120_validationCouchDB20091120_validation
CouchDB20091120_validationMakoto Ohnami
 
iOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いiOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いniwatako
 
Silverlight 5でぶり返すWPF不要論
Silverlight 5でぶり返すWPF不要論Silverlight 5でぶり返すWPF不要論
Silverlight 5でぶり返すWPF不要論Yuya Yamaki
 
BoF-09 Silverlight and WIF /TechEd Japan 2010
BoF-09 Silverlight and WIF /TechEd Japan 2010BoF-09 Silverlight and WIF /TechEd Japan 2010
BoF-09 Silverlight and WIF /TechEd Japan 2010Naohiro Fujie
 

Similar to 60分でわかる!SilverlightとWPFの入力チェック (20)

20120507 zendform
20120507 zendform20120507 zendform
20120507 zendform
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハックjQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
20120425
2012042520120425
20120425
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
 
継続的8章
継続的8章継続的8章
継続的8章
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
CouchDB20091120_validation
CouchDB20091120_validationCouchDB20091120_validation
CouchDB20091120_validation
 
iOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いiOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱い
 
Silverlight 5でぶり返すWPF不要論
Silverlight 5でぶり返すWPF不要論Silverlight 5でぶり返すWPF不要論
Silverlight 5でぶり返すWPF不要論
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Mvc conf session_4_ono
Mvc conf session_4_onoMvc conf session_4_ono
Mvc conf session_4_ono
 
BoF-09 Silverlight and WIF /TechEd Japan 2010
BoF-09 Silverlight and WIF /TechEd Japan 2010BoF-09 Silverlight and WIF /TechEd Japan 2010
BoF-09 Silverlight and WIF /TechEd Japan 2010
 
20111203
2011120320111203
20111203
 
20110607
2011060720110607
20110607
 

More from Yuya Yamaki

Basic言語でiOSアプリを作る
Basic言語でiOSアプリを作るBasic言語でiOSアプリを作る
Basic言語でiOSアプリを作るYuya Yamaki
 
続Xamarinはじめました
続Xamarinはじめました続Xamarinはじめました
続XamarinはじめましたYuya Yamaki
 
Xamarinはじめました
XamarinはじめましたXamarinはじめました
XamarinはじめましたYuya Yamaki
 
TypeScript入門してみた
TypeScript入門してみたTypeScript入門してみた
TypeScript入門してみたYuya Yamaki
 
Windowsの画面スケーリングを きちんと理解しよう
Windowsの画面スケーリングをきちんと理解しようWindowsの画面スケーリングをきちんと理解しよう
Windowsの画面スケーリングを きちんと理解しようYuya Yamaki
 
.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略Yuya Yamaki
 
.NET技術でこれからも食べていくための技術戦略
.NET技術でこれからも食べていくための技術戦略.NET技術でこれからも食べていくための技術戦略
.NET技術でこれからも食べていくための技術戦略Yuya Yamaki
 
Developers Summit 2013【14-E-3】Windows 8デザインガイド
Developers Summit 2013【14-E-3】Windows 8デザインガイドDevelopers Summit 2013【14-E-3】Windows 8デザインガイド
Developers Summit 2013【14-E-3】Windows 8デザインガイドYuya Yamaki
 
今さらWPF? いいえ、今こそWPF!
今さらWPF?いいえ、今こそWPF!今さらWPF?いいえ、今こそWPF!
今さらWPF? いいえ、今こそWPF!Yuya Yamaki
 
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革Yuya Yamaki
 
デスクトップアプリ開発者が押さえておくべき Windows 8時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8時代の変革デスクトップアプリ開発者が押さえておくべきWindows 8時代の変革
デスクトップアプリ開発者が押さえておくべき Windows 8時代の変革Yuya Yamaki
 
Windows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングWindows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングYuya Yamaki
 
どうなる?Windows 8時代の業務アプリ開発
どうなる?Windows 8時代の業務アプリ開発どうなる?Windows 8時代の業務アプリ開発
どうなる?Windows 8時代の業務アプリ開発Yuya Yamaki
 
Metroスタイルで花開くか? XAMLベースのUIフレームワーク
Metroスタイルで花開くか?XAMLベースのUIフレームワークMetroスタイルで花開くか?XAMLベースのUIフレームワーク
Metroスタイルで花開くか? XAMLベースのUIフレームワークYuya Yamaki
 
WPF/Silverlight視点で視る MetroスタイルのXAML
WPF/Silverlight視点で視るMetroスタイルのXAMLWPF/Silverlight視点で視るMetroスタイルのXAML
WPF/Silverlight視点で視る MetroスタイルのXAMLYuya Yamaki
 
77回スピーカーを経験して分かったこと」共有します
77回スピーカーを経験して分かったこと」共有します77回スピーカーを経験して分かったこと」共有します
77回スピーカーを経験して分かったこと」共有しますYuya Yamaki
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Yuya Yamaki
 
半透明は飾りです 偉い人にはそれがわからんのですよ
半透明は飾りです偉い人にはそれがわからんのですよ半透明は飾りです偉い人にはそれがわからんのですよ
半透明は飾りです 偉い人にはそれがわからんのですよYuya Yamaki
 
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?Yuya Yamaki
 
Silverlight Line-Of-Business Applications
Silverlight Line-Of-Business ApplicationsSilverlight Line-Of-Business Applications
Silverlight Line-Of-Business ApplicationsYuya Yamaki
 

More from Yuya Yamaki (20)

Basic言語でiOSアプリを作る
Basic言語でiOSアプリを作るBasic言語でiOSアプリを作る
Basic言語でiOSアプリを作る
 
続Xamarinはじめました
続Xamarinはじめました続Xamarinはじめました
続Xamarinはじめました
 
Xamarinはじめました
XamarinはじめましたXamarinはじめました
Xamarinはじめました
 
TypeScript入門してみた
TypeScript入門してみたTypeScript入門してみた
TypeScript入門してみた
 
Windowsの画面スケーリングを きちんと理解しよう
Windowsの画面スケーリングをきちんと理解しようWindowsの画面スケーリングをきちんと理解しよう
Windowsの画面スケーリングを きちんと理解しよう
 
.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略
 
.NET技術でこれからも食べていくための技術戦略
.NET技術でこれからも食べていくための技術戦略.NET技術でこれからも食べていくための技術戦略
.NET技術でこれからも食べていくための技術戦略
 
Developers Summit 2013【14-E-3】Windows 8デザインガイド
Developers Summit 2013【14-E-3】Windows 8デザインガイドDevelopers Summit 2013【14-E-3】Windows 8デザインガイド
Developers Summit 2013【14-E-3】Windows 8デザインガイド
 
今さらWPF? いいえ、今こそWPF!
今さらWPF?いいえ、今こそWPF!今さらWPF?いいえ、今こそWPF!
今さらWPF? いいえ、今こそWPF!
 
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8 時代の変革
 
デスクトップアプリ開発者が押さえておくべき Windows 8時代の変革
デスクトップアプリ開発者が押さえておくべきWindows 8時代の変革デスクトップアプリ開発者が押さえておくべきWindows 8時代の変革
デスクトップアプリ開発者が押さえておくべき Windows 8時代の変革
 
Windows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミングWindows 8時代のUXを支える非同期プログラミング
Windows 8時代のUXを支える非同期プログラミング
 
どうなる?Windows 8時代の業務アプリ開発
どうなる?Windows 8時代の業務アプリ開発どうなる?Windows 8時代の業務アプリ開発
どうなる?Windows 8時代の業務アプリ開発
 
Metroスタイルで花開くか? XAMLベースのUIフレームワーク
Metroスタイルで花開くか?XAMLベースのUIフレームワークMetroスタイルで花開くか?XAMLベースのUIフレームワーク
Metroスタイルで花開くか? XAMLベースのUIフレームワーク
 
WPF/Silverlight視点で視る MetroスタイルのXAML
WPF/Silverlight視点で視るMetroスタイルのXAMLWPF/Silverlight視点で視るMetroスタイルのXAML
WPF/Silverlight視点で視る MetroスタイルのXAML
 
77回スピーカーを経験して分かったこと」共有します
77回スピーカーを経験して分かったこと」共有します77回スピーカーを経験して分かったこと」共有します
77回スピーカーを経験して分かったこと」共有します
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。
 
半透明は飾りです 偉い人にはそれがわからんのですよ
半透明は飾りです偉い人にはそれがわからんのですよ半透明は飾りです偉い人にはそれがわからんのですよ
半透明は飾りです 偉い人にはそれがわからんのですよ
 
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?
Wpf 4とSilverlight 4、これから業務アプリを開発するならどっち?
 
Silverlight Line-Of-Business Applications
Silverlight Line-Of-Business ApplicationsSilverlight Line-Of-Business Applications
Silverlight Line-Of-Business Applications
 

Recently uploaded

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (8)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

60分でわかる!SilverlightとWPFの入力チェック

  • 1. VSUG DAY 2010 Winter 60分でわかる! SilverlightとWPFの 入力チェック グレープシティ株式会社 八巻 雄哉
  • 2. “入力チェック”とは UIが受け取ったユーザー入力の妥当性を 検証し、結果に応じて何らかの アクションをとること ユーザー入力後、コントロールに保持されて いる入力値を検証し、結果に応じてユーザー への通知を行うというアクションをとる VSUG DAY 2010.12.11 2
  • 3. 検証とアクション 検証 アクション TextBoxに入力された メッセージをToolTipで 値が数値かどうかを 表示する 確認する VSUG DAY 2010.12.11 3
  • 5. WPF/Silverlightの検証 WPF/Silverlightでは、 データバインディングのプロセスの1つ として検証機能が提供されている データ UI要素 バインディング オブジェクト オブジェクト 依存関係 検証 変換 プロパティ プロパティ バインディングターゲット バインディングソース VSUG DAY 2010.12.11 5
  • 6. 本セッションのデモを図解 abc@ Customer TextBox バインディング オブジェクト オブジェクト Text AccountName プロパティ プロパティ 検証 abc@ abc@ バインディングターゲット バインディングソース VSUG DAY 2010.12.11 6
  • 7. 検証処理実装方法の種類 Windows WPF 4 Silverlight 4 Phone OS 7.0 ValidationRuleを継承した ① ✔ - - カスタムクラス Exception(例外)によるエラー通知 ② ExceptionValidationRule ✔ - - ValidatesOnExceptions ✔ ✔ ✔ IDataErrorInfoによるエラー通知 ③ DataErrorValidationRule ✔ - - ValidatesOnDataErrors ✔ ✔ - INotifyDataErrorInfoによるエラー通知 ④ ValidatesOnNotifyDataErrors - ✔ - ValidatesOn***プロパティをTrueに設定した場合、***ValidationRuleを 設定したときと同じ動作となる。 Silverlight 4/Windows Phone OS 7.0には ValidationRulesプロパティが存在しないため、 必ずValidatesOn***を使用する。 VSUG DAY 2010.12.11 7
  • 8. ValidationRulesプロパティ使用 <TextBox> <TextBox.Text> <Binding Path="AccountName"> <Binding.ValidationRules> <ExceptionValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> WPF 4 VSUG DAY 2010.12.11 8
  • 9. ValidatesOn***プロパティ使用 <TextBox Text="{Binding AccountName, Validat esOnExceptions=True}"/> WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 9
  • 10. 2つの検証処理実装場所 ②Exception ③IDataErrorInfo ①ValidationRule ④INotifyDataErrorInfo バインディングターゲット バインディングソース UI要素 データオブジェクト 依存関係 プロパティ プロパティ VSUG DAY 2010.12.11 10
  • 11. ①ValidationRule WPF 4 VSUG DAY 2010.12.11 11
  • 12. ①ValidationRule <Binding Path="AccountName"> <Binding.ValidationRules> <local:AccountNameValidationRule/> </Binding.ValidationRules> </Binding> WPF 4 バインディング TextBox オブジェクト Customer カスタムValidationRule Text AccountName プロパティ ValidationResultを返す プロパティ VSUG DAY 2010.12.11 12
  • 13. カスタムValidationRule class AccountNameValidationRule : ValidationRule { public override ValidationResult Validate(object value, System.Glob・・・ { if (string.IsNullOrEmpty((string)value)) { return new ValidationResult(false, "必須入力項目です。"); } else if (!Regex.IsMatch((string)value, "^[0-9A-Za-z]{5,12}$")) { return new ValidationResult(false, "半角英数字5 文字以上12文字以下で入力 してください。"); } return ValidationResult.ValidResult; } } WPF 4 VSUG DAY 2010.12.11 13
  • 14. ①ValidationRule DEMO VSUG DAY 2010.12.11 14
  • 15. ②Exception WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 15
  • 16. ②Exception <TextBox Text="{Binding AccountName, ValidatesOnExceptions= True}"/> WPF 4 Silverlight 4 Windows Phone OS 7.0 バインディング TextBox オブジェクト Customer ValidatesOnExceptions=True AccountName Text プロパティ プロパティ 検証処理 例外をスロー VSUG DAY 2010.12.11 16
  • 17. Exception(例外)によるエラー通知 public string AccountName { get { return _accountName; } set { if (string.IsNullOrEmpty((string)value)) { throw new Exception("必須入力項目です。"); } else if (!Regex.IsMatch((string)value, "^[0-9A-Za-z]{5,12}$")) { throw new Exception("半角英数字5文字以上12文字以下で入力して ください。"); } _accountName = value; } } WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 17
  • 18. ②Exception DEMO VSUG DAY 2010.12.11 18
  • 19. System.ComponentModel. DataAnnotations名前空間 WPF 4 Silverlight 4 VSUG DAY 2010.12.11 19
  • 21. 検証属性を利用した検証処理 カスタムの検証属性 CustomValidationAttribute DataType列挙体に用意された ValidationAttribute(検証属性) DataTypeAttribute データ型(電話番号など)を指定 特定の列挙体を指定し、値が含まれ EnumDataTypeAttribute ることを保証 最小値および最大値の制約を指定 RangeAttribute RegularExpressionAttribute 正規表現を使用して有効な値を指定 RequiredAttribute 値が必須であることを指定 StringLengthAttribute 最大文字数および最小文字数を指定 VSUG DAY 2010.12.11 21
  • 22. Validatorクラス 検証属性を使用するためのヘルパークラス ValidatePropertyメソッド 指定されたプロパティの値が有効であるかどうか を判断し、プロパティが有効でない場合は、 ValidationExceptionをスローします。 VSUG DAY 2010.12.11 22
  • 23. 検証属性を使用して例外をスロー [Required(ErrorMessage = "必須入力項目です。")] [RegularExpression(@"^[0-9A-Za-z]{5,12}$", ErrorMessage = " 半角英数字5文字以上12文字以下で入力してください。")] public string AccountName { get { return _accountName; } set { Validator.ValidateProperty(value, new ValidationContext(th is, null, null) { MemberName = "AccountName" }); _accountName = value; } } WPF 4 Silverlight 4 VSUG DAY 2010.12.11 23
  • 24. ②Exception + 検証属性 DEMO VSUG DAY 2010.12.11 24
  • 25. ③IDataErrorInfo WPF 4 Silverlight 4 VSUG DAY 2010.12.11 25
  • 26. ③IDataErrorInfo <TextBox Text="{Binding AccountName, ValidatesOnDataErrors= True}"/> WPF 4 Silverlight 4 バインディング TextBox オブジェクト Customer ValidatesOnDataErrors=True AccountName Text プロパティ プロパティ 検証エラーメッセージ Itemプロパティ (String)を返す VSUG DAY 2010.12.11 26
  • 27. IDataErrorInfoのメンバー Errorプロパティ オブジェクトの検証エラーを説明する文字列 を取得。エラーが存在しない場合はnull参照。 Itemプロパティ(インデクサ) 指定されたプロパティの検証エラーを説明す る文字列を取得。エラーが存在しない場合は null参照。 VSUG DAY 2010.12.11 27
  • 28. サンプルコード( IDataErrorInfo ) public string this[string columnName] { get { switch (columnName) { case "AccountName": if (string.IsNullOrEmpty(AccountName)) { return "必須入力項目です。"; } else if (!Regex.IsMatch(AccountName, "^[0-9A-Za-z]{5,12}$")) { return "半角英数字5文字以上12文字以下で入力してください。"; } break; } return null; } } WPF 4 Silverlight 4 VSUG DAY 2010.12.11 28
  • 29. ③IDataErrorInfo DEMO VSUG DAY 2010.12.11 29
  • 30. Validatorクラス (System.ComponentModel.DataAnnotations名前空間) 検証属性を使用するためのヘルパークラス ValidatePropertyメソッド 指定されたプロパティの値が有効であるかどうか を判断し、値が有効でない場合は ValidationExceptionをスローします。 TryValidatePropertyメソッド 指定されたプロパティ値が有効であるかどうかを 判断し、値が有効な場合はTrue、そうでない場合 はFalseを返します。 VSUG DAY 2010.12.11 30
  • 31. 検証属性を使用して判定 public string this[string columnName] { get { var results = new List<ValidationResult>(); if (Validator.TryValidateProperty( GetType().GetProperty(columnName).GetValue(this, null), new ValidationContext(this, null, null) { MemberName = columnName }, results)) { return null; } return results.First().ErrorMessage; } } WPF 4 Silverlight 4 VSUG DAY 2010.12.11 31
  • 32. ③IDataErrorInfo + 検証属性 DEMO VSUG DAY 2010.12.11 32
  • 33. ④INotifyDataErrorInfo Silverlight 4 VSUG DAY 2010.12.11 33
  • 34. ④INotifyDataErrorInfo <TextBox Text="{Binding AccountName, ValidatesOnNotifyDataE rrors=True}"/> 既定でTrue Silverlight 4 バインディング TextBox オブジェクト Customer ValidatesOnNotifyDataErrors=True AccountName Text プロパティ プロパティ 検証エラー情報の GetErrors コレクションを返す メソッド ErrorsChangedイベント VSUG DAY 2010.12.11 34
  • 35. INotifyDataErrorInfoのメンバー GetErrorsメソッド 指定されたプロパティの検証、およびオブジェクト の検証におけるエラー情報(複数可)を取得。エ ラーが存在しない場合はnull参照。 HasErrorsプロパティ オブジェクトの検証エラーの有無をBoolean値として 取得 ErrorsChangedイベント プロパティまたはオブジェクト全体の検証エラーが 変更されたときに発生 VSUG DAY 2010.12.11 35
  • 36. DataErrorInfoの優位点 1つの項目で複数の検証エラーを返せる エラー内容として文字列(String)以外の 情報を設定可能(①も可) データバインディングによる値の更新 に同期せず、任意のタイミングで検証 可能 VSUG DAY 2010.12.11 36
  • 37. INotifyDataErrorInfoの実装例 public System.Collections.IEnumerable GetErrors(string property Name) { var results = new List<ValidationResult>(); if (Validator.TryValidateProperty( GetType().GetProperty(propertyName).GetValue(this, null), new ValidationContext(this, null, null) { MemberName = p ropertyName }, results)) { return null; } return results; } Silverlight 4 VSUG DAY 2010.12.11 37
  • 38. ErrorsChangedイベントの発行 public string AccountName { get { return _accountName; } set { // 実際にはここで非同期処理でサーバー側で値を検証し // ErrorsChangedイベントを発行する RaiseErrorsChanged("AccountName"); _accountName = value; } } Silverlight 4 VSUG DAY 2010.12.11 38
  • 41. 検証エラー発生時に何が起こるのか? その検証エラーに対応したValidationError オブジェクトが作成され、バインドされている 要素のValidation.Errors添付プロパティ (読み取り専用のコレクション)に追加される ValidationErrorクラス ErrorContentプロパティ エラーメッセージを取得 Exceptionプロパティ 検証エラーの原因となった例外を取得 VSUG DAY 2010.12.11 41
  • 42. 本セッションのデモを図解 Validation.Errors添付プロパティ ValidationErrorオブジェクト “5文字以上12文字以下です。” ValidationErrorオブジェクト “半角英数字のみ使用できます。” Customer TextBox バインディング オブジェクト オブジェクト Text AccountName プロパティ プロパティ 検証 abc@ abc@ バインディングターゲット バインディングソース VSUG DAY 2010.12.11 42
  • 43. 検証アクション実装方法の種類 Validation.Errors添付プロパティの値に 応じて、各種検証アクションのための仕 組みが動作する WPF Silverlight Windows Phone OS 7.0 a. ErrorTemplate ✔ - - b. ValidationStates ✔ ✔ ✔ 既定ではVisualStateは定義 既定で定義されている (VSM) されていない VisualStateは空 c. HasError ✔ ✔ ✔ 添付プロパティ (プロパティトリ ✔ - - ガー) ✔ ✔ ✔ d. イベント Validation.Error FrameworkElement.Bindi FrameworkElement.Bindi 添付イベント ngValidationErrorイベント ngValidationErrorイベント VSUG DAY 2010.12.11 43
  • 44. a. ErrorTemplate添付プロパティ WPF 4 VSUG DAY 2010.12.11 44
  • 45. a. ErrorTemplate添付プロパティ Validation.Errors添付プロパティの値が 空でない(検証条件に対して無効な値が 設定されている)場合に、 ErrorTemplate添付プロパティに設定さ れたテンプレート(外観)が表示される VSUG DAY 2010.12.11 45
  • 46. a. ErrorTemplate添付プロパティ Validation.ErrorTemplate(ControlTemplate型) デフォルトのErrorTemplate <Validation.ErrorTemplate> <ControlTemplate> <Border BorderBrush="#FFFF0000" BorderThickness="1,1,1,1"> <AdornedElementPlaceholder /> </Border> </ControlTemplate> </Validation.ErrorTemplate> WPF 4 AdornedElementPlaceholderはErrorTemplateが 適用される要素(今回の場合TextBox)を表す VSUG DAY 2010.12.11 46
  • 48. b. VisualStateManager(VSM) WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 48
  • 49. b. VisualStateManager(VSM) 動的な外観状態と、その外観状態に遷移する 条件や遷移にかかる時間を管理する一連の機能 を提供するのがVSM ValidationStates(VisualStateGroup) Errors添付 VisualState 説明 プロパティ 空 Valid コントロールが有効 InvalidFocused フォーカスがある状態で、コントロールが 無効 空でない InvalidUnfocused フォーカスがない状態で、コントロールが 無効 “見た目”を決めるコントロール・テンプレート - @IT http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_04/uiframework_04_03.html VSUG DAY 2010.12.11 49
  • 50. VSMの優位点 値が無効な場合だけでなく、値が有効な 場合の外観も定義できる 外観への遷移方法(VisualTransition)を 定義できる 難点 Expression Blendがないとちょっとキツイ VSUG DAY 2010.12.11 50
  • 51. b. VisualStateManager(VSM) DEMO VSUG DAY 2010.12.11 51
  • 52. c. HasError添付プロパティ WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 52
  • 53. c. HasError添付プロパティ(プロパティトリガー) 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> WPF 4 VSUG DAY 2010.12.11 53
  • 54. Silverlightのドキュメントより抜粋 WPFでは、プロパティトリガーによってデータ検証が実 行される場合があります。その場合、 Validation.HasErrorは、TriggerのProperty属性値を チェックするためのプロパティ条件として使用されます。 このようなイベントハンドラーは、コード中のオブジェ クトのValidation.HasError添付プロパティをチェック することができますが、通常はGetHasErrorメソッドを 呼び出すか、またはHasErrorProperty識別子を使用し て GetValue メソッドを呼び出します。 BindingValidationErrorイベントのハンドラーは、通常、 検証を行うためにそのロジックの一部として特定の VisualStateに変更されます。 VSUG DAY 2010.12.11 54
  • 55. d. イベント WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 55
  • 56. d. イベント WPF 4 Validation.Error添付イベント Silverlight 4/Windows Phone OS 7.0 FrameworkElement.BindingValidationErrorイベント ValidationErrorが追加/削除された際に 発生するイベント Binding.NotifyOnValidationErrorプロパティを Trueに設定する必要あり これらのイベントはルーティングイベント (バブル)となっているため、親要素の イベントハンドラーで通知を受け取ることが可能 VSUG DAY 2010.12.11 56
  • 57. d. イベント イベントの引数ValidationErrorEventArgsに 含まれているActionプロパティ ValidationErrorEventAction.Added 新しいValidationErrorオブジェクトが検出された ValidationErrorEventAction.Removed 既存のValidationErrorが削除された if (e.Action == ValidationErrorEventAction.Added) { // 検証エラーが発生した時の処理 } else if (e.Action == ValidationErrorEventAction.Removed) { //検証エラーがなくなった時の処理 } WPF 4 Silverlight 4 Windows Phone OS 7.0 VSUG DAY 2010.12.11 57
  • 58. d. イベント DEMO VSUG DAY 2010.12.11 58
  • 59. まとめ 検証 ① ValidationRule ② Exception ③ IDataErrorInfo ④ INotifyDataErrorInfo アクション a. ErrorTemplate添付プロパティ b. VisualStateManager(VSM) c. HasError添付プロパティ(プロパティトリガー) d. イベント VSUG DAY 2010.12.11 59
  • 60. 検証のまとめ図 ① ② ③ ④ ValidationRule Exception IDataErrorInfo INotifyDataErr orInfo 検証処理実装 バインディング バインディング バインディング バインディング 場所 ターゲット ソース ソース ソース 検証属性の利用 - ✔ ✔ ✔ 文字列以外の ✔ - - ✔ 検証エラー内容 複数の検証 - - - ✔ エラー通知 任意のタイミン - - - ✔ グで検証 利用可能プラッ WPF 4 WPF 4 WPF 4 トフォーム Silverlight 4 Silverlight 4 Silverlight 4 Windows Phone VSUG DAY 2010.12.11 60
  • 61. アクションのまとめ図 a. b. c. d. ErrorTemplate VisualStateMa HasError添付プ イベント 添付プロパティ nager(VSM) ロパティ(プロパ ティトリガー) サポートされる 有効 有効 有効 検証結果 無効 無効(フォーカス有) 無効 無効 無効(フォーカス無) ※フォーカス対応化 アクションの記 XAML XAML XAML コード 述 (コードの場合 GetHasErrorメソッド) 遷移アニメー - ✔ ✔ ションサポート 対象コントロー - - ✔ ✔ ルと無関係の要 素の外観を変更 利用可能プラッ WPF 4 WPF 4 WPF 4 WPF 4 トフォーム Silverlight 4 Silverlight 4 Silverlight 4 Windows Phone Windows Phone Windows Phone VSUG DAY 2010.12.11 61
  • 62. “入力チェック”とは UIが受け取ったユーザー入力の妥当性を 検証し、結果に応じて何らかの アクションをとること ユーザー入力後、コントロールに保持されて いる入力値を検証し、結果に応じてユーザー への通知を行うというアクションをとる ユーザー入力時に入力を検証し、結果に応じ てその入力を無効にする/有効な入力に変換 するというアクションをとる VSUG DAY 2010.12.11 62
  • 63. 検証タイミングで異なる開発面の特徴 入力後 プロパティ値を確認するという 単純処理であるため、難易度が低い 様々なケースに対応できる反面、 汎用化が難しい 入力中 キー入力に加え、マウス操作、貼り付け、 カレット制御などを考慮する必要がある プリミティブな部分での実装が必要となり 難易度が高い VSUG DAY 2010.12.11 63
  • 64. InputManファミリー 日本の業務アプリケーションに求められる 高度な入力支援機能を提供するコントロール集 for Silverlight for WPF for Windows for ASP.NET Forms VSUG DAY 2010.12.11 64
  • 65. InputMan for Silverlight 1.0J Silverlight標準に不足している業務コントロールをカバー GcTextBox テキストコントロール GcMask マスクコントロール GcDateTime 日付コントロール GcNumber 数値コントロール GcDropDownCalculator ドロップダウン電卓コントロール GcDropDownCalendar ドロップダウンカレンダーコントロール GcValidationIndicator 検証インジケータコントロール GcImeManager ふりがな取得コンポーネント 和暦の表示/入力(M・T・S・Hや元年表示にも対応) 文字種指定の入力制御(ひらがな、カタカナ、記号、全角、半角、 スペース、サロゲートペア文字など) ノンコーディングでフォーカス制御 フリガナ自動取得 祝日の登録や曜日のスタイルを設定できるカレンダー VSUG DAY 2010.12.11 65
  • 66. GcTextBox.Formatプロパティ <im:GcTextBox Format="Aa9" /> WPF 4 Silverlight 4 全角 半角 説明 A A 大文字のアルファベット(A~Z) a a 小文字のアルファベット(a~z) K K カタカナ(促音・拗音の小書き表記あり) N N カタカナ(促音・拗音の小書き表記なし) 9 9 数字(0~9) # # 数字および数字関連記号(0~9、+ - $ % ¥ , .) @ @ 記号(! " # $ % & ' ( ) - = ^ ~ ¥ | @ ` [ { ; + : * ] } , < . > / ? _) B B 2進数(0または1) X X 16進数(0~9、A~F) J - ひらがな(促音・拗音の小書き表記あり) G - ひらがな(促音・拗音の小書き表記なし) Z - すべての全角文字 T - サロゲート ペア文字 S S 空白文字 - H すべての半角文字 - ^ 指定した書式に含まれないすべての文字 - ¥ エスケープシーケンス VSUG DAY 2010.12.11 66
  • 67. 67
  • 68. Appendix VSUG DAY 2010.12.11 68
  • 69. 検証属性の自動適用 Silverlight 4 VSUG DAY 2010.12.11 69
  • 70. 検証属性の自動適用 Silverlight 4のDataGrid データ注釈を使用したデータ クラスのカスタマイズ http://msdn.microsoft.com/ja-jp/library/dd901590.aspx WCF RIA Services How to: Validate Data http://msdn.microsoft.com/en-us/library/ee707335.aspx VSUG DAY 2010.12.11 70
  • 72. ValidationRule.ValidationStepプロパティ ValidationSt 説明 ExceptionVa DataErrorVa ValidationR ep 列挙値 lidationRule lidationRule uleを継承し たカスタムク ラス RawPropose 変換が行われ デフォルト 不可 デフォルト dValue る前 ConvertedPr 変換が行われ oposedValu た後 可 不可 可 e UpdatedVal ソースの更新 可 可 可※ ue 後 CommittedV 値がソースに alue コミットされ 可 デフォルト 可※ た後 ※Validationメソッドの引数valueはBindingExpressionオブジェクト WPF 4 VSUG DAY 2010.12.11 72
  • 73. BindingGroup WPF 4 VSUG DAY 2010.12.11 73
  • 74. BindingGroupプロパティ 以下の条件のどちらかを満たしている場合、 Bindingがグループ化される BindingのソースとBindingGroupを設定した要素の DataContextが同じ BindingのBindingGroupNameプロパティが BindingGroupのNameと同じ <Grid.BindingGroup> <BindingGroup> <BindingGroup.ValidationRules> <local:ObjectValidation/> </BindingGroup.ValidationRules> </BindingGroup> </Grid.BindingGroup> WPF 4 VSUG DAY 2010.12.11 74
  • 75. 個々の検証をまとめて実行 Bindingがグループ化されることにより、 各Bindingは個別に更新されなくなる。 任意のタイミングで 一気にすべての項目を更新させることが可能 個々の検証をまとめて実行できる。 個々ValidationRuleは、ValidationStepが RawProposedValueであるもののみがBindingGroupの ValidationRuleよりも前に実行される。 VSUG DAY 2010.12.11 75
  • 76. 編集トランザクション メソッド名 説明 BeginEdit 編集トランザクションを開始します。 CommitEdit すべてのValidationRuleを実行し、 成功した場合はバインディングソースを更新します。 CancelEdit 編集トランザクションを終了し、保留中の変更を破棄します。 VSUG DAY 2010.12.11 76
  • 77. 編集トランザクション 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 WPF 4 VSUG DAY 2010.12.11 77