C# WPF文本框验证问题

C# WPF文本框验证问题,c#,wpf,C#,Wpf,我有文本框,这些名称是CheckDescriptionTextBox和parameterTxtBox。两者都使用相同的验证规则,例如TextBoxValidator.cs中提供的验证规则。但一个区别是在parameterTxtBox中添加了ValidationStep=“UpdatedValue”。checkDescriptionTxtBox验证按预期工作,但为什么parameterTxtBox验证不工作?请帮助任何人 我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckD

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


我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckDescriptionXTBox验证期间,参数值作为字符串传递,但在parameterTxtBox验证期间,参数值不是作为字符串传递,而是作为差异绑定值传递。因此,我希望在更新源属性后验证该值。如何做到这一点

<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;
                    }
                }

TextBoxValidator.cs
公共类TextBoxValidator:ValidationRule
{
公共覆盖验证结果验证(对象值,System.Globalization.CultureInfo CultureInfo)
{
if(String.IsNullOrEmpty(value.ToString().Trim()))
返回新的ValidationResult(false,“值不能为空”);
返回ValidationResult.ValidResult;
}
}

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

因此,由于
checkDescriptionXTBox
有效,您只需从
parameterTxtBox
TextBoxValidator
中删除
ValidationStep=“UpdatedValue”


但我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckDescriptionXTBox验证期间,参数值作为字符串传递,但在parameterTxtBox验证期间,参数值不是作为字符串传递,而是作为差异绑定值传递。因此,我希望在更新源属性后验证该值。如何做到这一点

<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;
                    }
                }
强制转换为
BindingExpression
a使用一些反射:

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;
    }
}
目前我正在使用.NET4。我希望能得到解决;和.Net 4.5中支持的be.ResolvedSourcePropertyName。那么如何在.NET4中实现这一点呢

这应该在.NET Framework 4中起作用:

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
    string s = null;
    BindingExpression be = value as BindingExpression;
    if (be != null)
    {
        object sourceObject = be.DataItem;
        string sourceProperty = be.ParentBinding.Path.Path;
        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;
}

谢谢你的信息。但我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckDescriptionXTBox验证期间,参数值作为字符串传递,但在parameterTxtBox验证期间,参数值不是作为字符串传递,而是作为差异绑定值传递。因此,我希望在更新源属性后验证该值。如何做到这一点?谢谢你的回复。目前我正在使用.NET4。我希望能得到解决;和.Net 4.5中支持的be.ResolvedSourcePropertyName。那么我如何在.Net 4中实现这一点呢?@Arunagiri:请参见:.string[]splits=expr.ParentBinding.Path.Path.Split('.');Type Type=expr.DataItem.GetType();foreach(字符串拆分){type=type.GetProperty(拆分).PropertyType;}如何在我的验证方法中使用上述代码。您可以分享验证方法的完整代码吗?我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckDescriptionXTBox验证期间,参数值作为字符串传递,但在parameterTxtBox验证期间,参数值不是作为字符串传递,而是作为差异绑定值传递。因此,我希望在更新源属性后验证该值。如何做到这一点?