WPFバインドの検証

4320 ワード

検証を行うには、ValidationRuleから継承されるRangeValidationRuleクラスを用意する必要があります.
このクラスは次のように実装されます.
class RangeValidationRule : ValidationRule

    {

        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)

        {

            double d;

            if (double.TryParse(value.ToString(), out d))

            {

                if (d >= 0 && d <= 100)

                {

                    return new ValidationResult(true, null);

                }

            }

            return new ValidationResult(false, "Validation Failed");

        }

    }

インタフェースにはまだ2つのコントロールがあり、対応するXAML
<Grid>

        <TextBox Height="23" HorizontalAlignment="Left" Margin="84,63,0,0" Name="textBox1" VerticalAlignment="Top" Width="336" IsEnabled="True"/>

        <Slider Name="slider1" Height="23" HorizontalAlignment="Left" Margin="84,125,0,0" VerticalAlignment="Top" Width="336" Maximum="110"  Minimum="-1"/>

    </Grid>


  
1.基本検証
  //1. 

            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

            binding.ValidationRules.Add(new RangeValidationRule());

            this.textBox1.SetBinding(TextBox.TextProperty, binding);

2.データソースの検証
//2. source

            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

            binding.ValidationRules.Add(new RangeValidationRule() 

            {

                ValidatesOnTargetUpdated = true

            });

            binding.NotifyOnValidationError = true;

            this.textBox1.SetBinding(TextBox.TextProperty, binding);

3.ルーティングイベントの追加
  this.textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler((sender, e) =>

                {

                    if (Validation.GetErrors(this.textBox1).Count > 0)

                    {

                        this.textBox1.ToolTip = Validation.GetErrors(this.textBox1)[0].ErrorContent.ToString();

                    }

                }));