WPF TextBox验证问题

时间:2018-10-12 12:57:38

标签: c# wpf

我有一个文本框,名称是checkDescriptionTxtBox和parameterTxtBox。两者都使用相同的验证规则,例如TextBoxValidator.cs中可用。但是一个区别是在parameterTxtBox中添加了ValidationStep =“ UpdatedValue”。 checkDescriptionTxtBox验证可以正常工作,但是为什么parameterTxtBox验证不起作用?请您帮助任何人。

我想在源属性更新后验证值。我已经调试了Validate方法。在checkDescriptionTxtBox验证参数值作为字符串传递的过程中,但是当parameterTxtBox验证参数值不作为字符串传递的而是差异绑定值时。所以我想在source属性更新后验证值。如何实现呢?

<TextBox Name="checkDescriptionTxtBox" Width="700" TextWrapping="Wrap" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                                <TextBox.Text>
                                    <Binding Path="CheckDescription" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                        <Binding.ValidationRules>
                                            <v:TextBoxValidator></v:TextBoxValidator>
                                        </Binding.ValidationRules>
                                    </Binding>
                                </TextBox.Text>
                            </TextBox>

<TextBox Name="parameterTxtBox" Margin="10,0,0,0" Width="200" Height="20" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                                                <TextBox.Text>
                                                    <Binding Path="ParameterValue" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
                                                        <Binding.ValidationRules>
                                                            <v:TextBoxValidator ValidationStep="UpdatedValue"></v:TextBoxValidator>
                                                        </Binding.ValidationRules>
                                                    </Binding>
                                                </TextBox.Text>
                                            </TextBox>


    TextBoxValidator.cs    
        public class TextBoxValidator : ValidationRule
            {
             public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
                    {
                        if (String.IsNullOrEmpty(value.ToString().Trim()))
                            return new ValidationResult(false, "Value cannot be empty");

                        return ValidationResult.ValidResult;
                    }
                }

1 个答案:

答案 0 :(得分:1)

ValidationStep属性设置为UpdatedValue意味着验证规则将在更新源属性后 运行。如果源属性未更新,则验证规则将不会运行。 ValidationStep属性的默认值为RawProposedValue,这意味着验证规则是在 发生值转换之前运行的。

因此,由于checkDescriptionTxtBox有效,您只需从ValidationStep="UpdatedValue"的{​​{1}}中删除TextBoxValidator

  

但是我想在源属性更新后验证值。我已经调试了Validate方法。在checkDescriptionTxtBox验证参数值作为字符串传递的过程中,但是当parameterTxtBox验证参数值不作为字符串传递的而是差异绑定值时。所以我想在source属性更新后验证值。如何实现呢?

使用一些思考将parameterTxtBox投射到value

BindingExpression
  

当前我正在使用.Net 4。我希望是be.ResolvedSource;和.Net 4.5中支持的be.ResolvedSourcePropertyName。那我该如何在.Net 4中实现呢?

这应在.NET Framework 4中工作:

public class TextBoxValidator : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        string s = null;
        BindingExpression be = value as BindingExpression;
        if(be != null)
        {
            object sourceObject = be.ResolvedSource;
            string sourceProperty = be.ResolvedSourcePropertyName;
            if(sourceObject != null && sourceProperty != null)
            {
                PropertyInfo pi = sourceObject.GetType().GetProperty(sourceProperty);
                s = pi.GetValue(sourceObject) as string;

            }
        }
        else
        {
            s = value as string;
        }

        if (string.IsNullOrEmpty(s))
            return new ValidationResult(false, "Value cannot be empty");

        return ValidationResult.ValidResult;
    }
}