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();
        }
    }

これで少し様子をみてみよう。