C# WPF文本框验证问题
我有文本框,这些名称是CheckDescriptionTextBox和parameterTxtBox。两者都使用相同的验证规则,例如TextBoxValidator.cs中提供的验证规则。但一个区别是在parameterTxtBox中添加了ValidationStep=“UpdatedValue”。checkDescriptionTxtBox验证按预期工作,但为什么parameterTxtBox验证不工作?请帮助任何人C# WPF文本框验证问题,c#,wpf,C#,Wpf,我有文本框,这些名称是CheckDescriptionTextBox和parameterTxtBox。两者都使用相同的验证规则,例如TextBoxValidator.cs中提供的验证规则。但一个区别是在parameterTxtBox中添加了ValidationStep=“UpdatedValue”。checkDescriptionTxtBox验证按预期工作,但为什么parameterTxtBox验证不工作?请帮助任何人 我想在更新源属性后验证该值。我已经调试了Validate方法。在CheckD
我想在更新源属性后验证该值。我已经调试了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验证期间,参数值不是作为字符串传递,而是作为差异绑定值传递。因此,我希望在更新源属性后验证该值。如何做到这一点?