NotifyOnValidationErrorBehavior修正
先日公開したNotifyOnValidationErrorBehaviorクラスだが、複数のコントロールがそれぞれ違うBrushを使っていると対応できない。(テストしていないことがばればれだ)
なので、Controlに対応するBrushを格納する辞書を利用するように修正してみた。
NotifyOnValidationErrorBehaviorクラス(Revised)
public class NotifyOnValidationErrorBehavior : Behavior<FrameworkElement> { private static readonly Brush _errorBrush = new SolidColorBrush(Colors.Red); private readonly EventHandler<ValidationErrorEventArgs> _errorHandler; private readonly Dictionary<Control, Brush> _saveForgroundBrushes; private readonly Dictionary<Control, Brush> _saveBorderBrushes ; /// <summary> /// デフォルトコンストラクタ /// </summary> public NotifyOnValidationErrorBehavior() { _saveForgroundBrushes = new Dictionary<Control, Brush>(); _saveBorderBrushes = new Dictionary<Control, Brush>(); _errorHandler = (s, e) => { var control = e.OriginalSource as Control; if (control == null) return; if (e.Action == ValidationErrorEventAction.Added) { _saveForgroundBrushes[control] = control.Foreground; _saveBorderBrushes[control] = control.BorderBrush; control.Foreground = _errorBrush; control.BorderBrush = _errorBrush; control.FontWeight = FontWeights.Bold; } else if (e.Action == ValidationErrorEventAction.Removed) { control.Foreground = _saveForgroundBrushes[control]; control.BorderBrush = _saveBorderBrushes[control]; control.FontWeight = FontWeights.Normal; } }; } protected override void OnAttached() { base.OnAttached(); AssociatedObject.BindingValidationError += _errorHandler; } protected override void OnDetaching() { AssociatedObject.BindingValidationError -= _errorHandler; _saveForgroundBrushes.Clear(); _saveBorderBrushes.Clear(); base.OnDetaching(); } }
これで少し様子をみてみよう。