バリデーションを追加する

ValidationRuleを継承したValidationRuleクラスを作成する。今回はxamlで文字数を指定できるStrValidationRuleを作成した。回りくどい記述は警告を回避するため。

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

namespace AddressBook
{
    internal class StrValidationRule : ValidationRule
    {
        public int MinLength { get; set; } = int.MinValue;
        public int MaxLength { get; set; } = int.MaxValue;
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value is null)
            {
                if (MinLength == 0)
                    return ValidationResult.ValidResult;
                else
                    return new ValidationResult(false, "この項目は必須です");
            }
            string? str = value.ToString();
            if (str != null)
            {
                if (str.Length == 0)
                {
                    if (MinLength == 0)
                        return ValidationResult.ValidResult;
                    else
                        return new ValidationResult(false, "この項目は必須です");
                }
                if (str.Length < MinLength)
                {
                    return new ValidationResult(false, "値が短すぎです");
                }
                if (str.Length > MaxLength)
                {
                    return new ValidationResult(false, "値が長すぎです");
                }
            }

            return ValidationResult.ValidResult;
        }
    }
}

Binding.ValidationRulesタグを追加する。MinLengthとMaxLengthを設定することにより文字数の範囲を指定できる。

起動時のバリデーションを無効にする場合はValidatesOnTargetUpdatedを”False”にする(記述を省略する)

<TextBox x:Name="textName" Grid.Column="1" Grid.Row="1" Margin="4,4,4,4">
    <TextBox.Text>
        <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:StrValidationRule ValidatesOnTargetUpdated="True" MinLength="2" MaxLength="5"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

実行結果

2文字未満だとエラー
2~5文字だとOK
6文字以上はエラー

トップページ

コメント

タイトルとURLをコピーしました