ValidationRule成功后仍显示WPF文本框红色边框
我有一个带有非常简单的验证规则的文本框:ValidationRule成功后仍显示WPF文本框红色边框,wpf,validationrule,Wpf,Validationrule,我有一个带有非常简单的验证规则的文本框: <TextBox x:Name="textFirstName" Width="120"> <TextBox.Text> <Binding Path="CurrentSelectionData.Tables[cpeople].Rows[0][FirstName]" UpdateSourceTrigger="PropertyChanged">
<TextBox x:Name="textFirstName" Width="120">
<TextBox.Text>
<Binding
Path="CurrentSelectionData.Tables[cpeople].Rows[0][FirstName]"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
public class NonEmptyStringValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
return new ValidationResult(false, "Must provide a value.");
return ValidationResult.ValidResult;
}
}
公共类NonEmptyStringValidationRule:ValidationRule
{
公共覆盖验证结果验证(对象值,System.Globalization.CultureInfo CultureInfo)
{
if(value==null | | string.IsNullOrWhiteSpace(value.ToString()))
返回新的ValidationResult(false,“必须提供值”);
返回ValidationResult.ValidResult;
}
}
问题在于,即使文本框绑定到非空数据,启动时也会显示红色的验证错误边框
观察验证规则上的断点,我看到它会为空字符串调用一次(在绑定更改为有效数据之前),并在绑定更新为有效数据之后再次调用。果然,第二个调用返回ValidResult,但红色边框仍然存在
手动清除文本框并在其中键入新文本将清除红色边框,但仅在未首先清除的情况下在其中键入新文本不会清除红色边框
从阅读其他人的问题中,我可以看到一个潜在的诡计,那就是这个文本框位于选项卡控件中。然而,我的问题与其他人相反(尽管验证失败,但他们没有得到红色边框),我也没有在任何时候移动到不同的选项卡控件(这是其他问题的原因)
你知道我在这里遗漏了什么吗?我试图复制你的问题,但在我的测试中它似乎工作正常,所以问题一定是你绑定到的数据,正如你所说的
验证规则
工作正常
该表是您双向绑定到的吗
我的测试:
xaml:
事实证明,在窗口加载事件期间更改已验证的绑定数据导致了问题。在我的例子中,问题是通过在初始化或ContentRendered期间执行数据更改来解决的。Initialized具有在第一次(无效)绑定之前发生的优点,因此避免了在应用程序加载过程中出现临时红色边框。能否发布NonEmptyStringValidationRule
code请查看上面的代码编辑。您是否尝试将该模式设置为双向?是的,绑定是双向的。就我所知,除了验证显示之外,其他一切都很正常。如果有关系,文本框将绑定到数据集中DataTable唯一一行中的字段。详细信息。问题是由于第二次绑定更新(导致有效数据的绑定更新)发生在主窗口的加载事件处理程序中。除非您需要,否则我不会用确切的机制来打扰您,但我只想说,将导致绑定更新的属性更改延迟到应用程序完全打开之后可以避免问题。有人对此有什么解释吗?我现在也有同样的问题,你能不能在你的回答中再详细说明一下你为避免这种情况而做的改变?
<TextBox x:Name="textFirstName" Width="120" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}">
<TextBox.Text>
<Binding ElementName="UI" Path="TextTest" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" >
<Binding.ValidationRules>
<local:NonEmptyStringValidationRule ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private string _textTest;
public string TextTest
{
get { return _textTest ; }
set { _textTest = value; }
}
}
public class NonEmptyStringValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return (value is string && !string.IsNullOrEmpty(value.ToString()))
? new ValidationResult(true, null)
: new ValidationResult(false, "Invalid Text");
}
}