開発記その 7 - バインディングエラーがある場合は処理をしないように -

さて、http://d.hatena.ne.jp/k_maru/20100815/1281885406 の続きです。
バインディングエラーがある場合に処理をしないようにするのも同時に実装してました。

前の投稿で実装していた ValidationErrorInfo に IsPropertyValidationError っていうプロパティを実装しています。こいつはプロパティのバインド時に発生したエラーかどうかを保持しています。で、ViewModelBase で保持している一連の ValidationErrorInfo を調べて IsPropertyValidationError が true のものがあるかを取得する HasPropertyValidationErrors ってのを作りました。

public bool HasPropertyValidationErrors {
  get {
    if (!this.HasErrors) {
      return false;
    }
    foreach (string key in this.errors.Keys) {
      ValidationErrorInfo info = this.errors[key].FirstOrDefault(i => i.IsPropertyValidationError);
      if (info != null) {
        return true;
      }
    }
    return false;
  }
}


このプロパティをログインボタンクリック時の EventTrigger に仕掛けた ConditionBehavior の条件にして、 true の場合は Action を実行しないようにしています。

<i:EventTrigger EventName="Click">
  <i:Interaction.Behaviors>
    <ei:ConditionBehavior>
      <ei:ConditionalExpression>
        <ei:ComparisonCondition LeftOperand="{Binding DataContext.HasPropertyValidationErrors, ElementName=Self}"
                                RightOperand="false" />
      </ei:ConditionalExpression>
    </ei:ConditionBehavior>
  </i:Interaction.Behaviors>
  <localInteractivity:InvokeMethodAction Target="{Binding DataContext, ElementName=Self}" MethodName="Login"/>
</i:EventTrigger>

この ConditionBehavior って Blend の SDK にシレッと入ってたんやけど、意外と使えそうです。っていうか、 Trigger とかに Behaviour をさせたんですね。具体例はすぐに思い浮かばへんけど、いろいろ使えそうです。


さてさて、やっとこれでログインは完了かな。


※今回のチェックイン(前回と一緒)
http://moneybook.codeplex.com/SourceControl/changeset/changes/54103