我有一个非常简单的ValidationRule文本框:
<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;
}
}
问题是即使文本框绑定到非空数据,启动时也会显示红色验证错误边框。
在验证规则上观察断点,我看到它为空字符串调用一次(在绑定更改为有效数据之前),并在绑定更新为有效数据之后再次调用。果然,第二次调用返回ValidResult,但红色边框仍然存在。
手动清除文本框并在其中键入新文本会清除红色边框,但只需先键入新文本而不先清除它就不会。
通过阅读其他人的问题,我可以看到的一个潜在的棘手问题是,此TextBox位于制表符控件中。但是,我的问题与其他人相反(尽管验证失败,他们没有获得红色边框),我也没有在任何时候转向不同的选项卡控件(这是其他问题的原因)。 / p>
我在这里缺少什么想法?
答案 0 :(得分:1)
事实证明,在Window的Loaded事件期间更改已验证的绑定数据会导致问题。就我而言,问题是通过在Initialized或ContentRendered期间执行数据更改来解决的。 Initialized具有在第一个(无效)绑定之前发生的优势,从而避免临时红色边框在应用程序加载期间闪烁。
答案 1 :(得分:0)
我试图复制你的问题,但它似乎在我的测试中运行正常,所以问题必须是你绑定的数据,因为你说validationRule
工作正常。
表格是否与TwoWay
绑定?
我的测试:
XAML:
<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");
}
}