WPF之Validation

WPF在中國沒有大規模的推開,但是這並不掩飾她的魅力。最近學到了Validation,記錄下。

WPF中的Validation有以下幾種:

  1. ValidationRule
  2. IDataErrorInfo
  3. INotifyDataErrorInfo
  4. Custom Controls
  5. 等等

先說ValidationRule,首先她是個抽象函數,一般我們需要Override她的Validate方法,她有3個重載函數,無論是誰都返回ValidationResult對象。下面就我的例子詳細來說明,先上個截圖:

Textbox的Text屬性綁定到Slider的值,當Textbox的值不在0到100之間時,會出現Textbox的邊框紅色,下面出現一行提示的信息,還可以設置TextBox的Tooltip值,這個不好截圖。

下面是UI部分的代碼:

    <StackPanel>
        <StackPanel.Resources>
            <Style x:Key="txb" TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="True">
                        <Setter Property="BorderBrush" Value="Red"/>
                        <Setter Property="ToolTip" 
                                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </StackPanel.Resources>
        <TextBox x:Name="texBox" Margin="5" Style="{StaticResource txb}">
            <Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged"
                     NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <local:RangeValidationRule ValidatesOnTargetUpdated="True"/>
                </Binding.ValidationRules>
            </Binding>
            <Validation.ErrorTemplate>
                <ControlTemplate>
                    <StackPanel>
                        <!-- Placeholder for the TextBox itself -->
                        <AdornedElementPlaceholder x:Name="textBox"/>
                        <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
                    </StackPanel>
                </ControlTemplate>
            </Validation.ErrorTemplate>
        </TextBox>
        <Slider x:Name="slider" Minimum="-10" Maximum="100" Margin="5,20,5,5"
                IsSnapToTickEnabled="True"/>
    </StackPanel>



後臺部分就一個ValidationRule需要記錄下:

class RangeValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            int index = 0;
            if (int.TryParse(value.ToString(), out index))
            {
                if((index >= 0) && (index <= 100))
                    return new ValidationResult(true, null);
            }
            return new ValidationResult(false, string.Format("{0} is not between 0 and 100!", value)); 
        }
    }

以上關鍵部分已有註釋,其實很簡單,沒試過永遠很難!先記錄到這裏,明天記錄後面的方式。

ValidationRule雖好,但是現在都是講究MVVM,從以上代碼可以看出,很顯然她不適合MVVM的模式,所以在MVVM模式中一般不使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章