開発記その 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