C#のWPFの入力規制を一括チェック

WPFでは入力規制を視覚的にフィードバックしてくれる仕組みがある。

 

その入力規制のエラー有り無しをコード側からチェックするには、

ValidationクラスのGetHasErrorメソッドを使えばよい。

エラーがあった場合はGetErrorsメソッドによってエラー内容を取得できる。

1画面にたくさんのコントロールが並ぶ場合、1つ1つチェックするコードを書くのは面倒だが、

 

コントロールのツリー構造をたどる事で一括でチェックする事が出来る。

以下は、コントロールのツリー構造をたどり、エラーのあるコントロールを取得する。

using System;
using System.Windows;
using System.Windows.Controls;

namespace xxxx
{
    public class UIHelper
    {
        public static DependencyObject GetValidationError(DependencyObject element)
        {
            if (null == element) return null;
            if (Validation.GetHasError(element)) return element;

            for (int i = 0; i != System.Windows.Media.VisualTreeHelper.GetChildrenCount(element); ++i)
            {
                var child = System.Windows.Media.VisualTreeHelper.GetChild(element, i);
                var ret = GetValidationError(child);
                if (null != ret) return ret;
            }
            return null;
        }
    }
}

 

 

上記メソッドへ、複数のコントロールが配置されたパネルなどを引数とすると、子階層も含めエラー箇所を有無を確認出来る。

    var errObj = UIHelper.GetValidationError(this.MyPanel);
    if (null != errObj)
    {
        var errElem = errObj as UIElement;
        if (null != errElem) errElem.Focus();
        var err = Validation.GetErrors(errObj);
        MessageBox.Show(err[0].ErrorContent.ToString(), "ERROR!", MessageBoxButton.OK, MessageBoxImage.Information);
        return;
    }