我有一个文本框,名称是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;
}
}
答案 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;
}
}