概要

WPF の XamTextEditor で EditModeValidationError イベント処理中に、ValueConstraint の RegexPattern によるエラーかどうかを判別する方法について説明します。

対象コントロール

  • Infragistics WPF — XamTextEditor

問題

ValueConstraint に RegexPattern、MinLength、MaxLength など複数の制約を設定した場合、EditModeValidationError イベントの引数にはどの制約に違反したかを示すプロパティが提供されていないため、RegexPattern によるエラーかどうかを直接判別できません。

解説

イベントハンドラ内で再検証を行う

EditModeValidationError イベントには違反した制約の種類を示す情報がないため、イベントハンドラ内で RegexPattern に対する再検証を行い、エラー原因を判別します。

手順は以下のとおりです。

  1. editor.Text で入力中の表示テキストを取得
  2. editor.ValueConstraint.RegexPattern で設定済みの正規表現パターンを取得
  3. Regex.IsMatch() でパターンに一致するかを判定

サンプルコード

private void xamTextEditor1_EditModeValidationError(object sender, Infragistics.Windows.Editors.Events.EditModeValidationErrorEventArgs e)
{
    var editor = sender as XamTextEditor;
    if (editor == null) return;

    // 入力中の表示テキストを取得
    string displayText = editor.Text;

    // ValueConstraint に設定された RegexPattern を取得
    string? regexPattern = editor.ValueConstraint?.RegexPattern;

    // RegexPattern によるエラーかどうかを再検証
    bool isRegexError = !string.IsNullOrEmpty(regexPattern)
        && !string.IsNullOrEmpty(displayText)
        && !Regex.IsMatch(displayText, regexPattern);

    if (isRegexError)
    {
        // RegexPattern に違反している場合 → エディタごとにメッセージを出し分け
        if (editor.Name == "xamTextEditor1")
        {
            MessageBox.Show(
                $"記号は入力できません。\\n(正規表現パターン: {regexPattern})",
                "入力エラー(RegexPattern 違反)");
        }
        else if (editor.Name == "xamTextEditor2")
        {
            MessageBox.Show(
                $"数字のみ入力可能です。\\n(正規表現パターン: {regexPattern})",
                "入力エラー(RegexPattern 違反)");
        }
    }
    else
    {
        // RegexPattern 以外の ValueConstraint 条件(MinLength, MaxLength 等)によるエラー
        MessageBox.Show(
            $"入力値が制約条件を満たしていません。\\n入力値: {displayText}",
            "入力エラー(その他の制約違反)");
    }
}

まとめ

項目コード説明
入力値の取得editor.Text現在の入力テキストを取得する。
RegexPattern の取得editor.ValueConstraint?.RegexPatternValueConstraint に設定された正規表現パターンを取得する。
再検証Regex.IsMatch(displayText, regexPattern)パターンに一致しなければ RegexPattern 違反と判別できる。
Tagged:

製品について

Ultimate UI for WPF