我有两个来自Xceed WPF Toolkit的DateTimePickers并使用MahApps Metro,验证错误模板是default one provided by Metro({DynamicResource ValidationErrorTemplate}
)。使用如下验证属性处理验证:
[TimeSpanValidator]
public TimeSpan StartTime
{
get { ... }
set { ... }
}
[TimeSpanValidator]
public TimeSpan EndTime
{
get { ... }
set { ... }
}
引用的验证器类:
public class TimeSpanValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
EditEntryViewModel viewmodel = validationContext.ObjectInstance as EditEntryViewModel;
if (viewmodel == null)
{
Debug.Fail("Error in validation: ViewModel was not assigned.");
return ValidationResult.Success;
}
if (!viewmodel.ValidTimeSpan)
return new ValidationResult("End time must not be earlier than start time.");
if (!viewmodel.TimeSpanUnoccupied)
return new ValidationResult("The timespan overlaps with an existing entry.");
return ValidationResult.Success;
}
}
只要打开窗口时没有错误,这就可以正常工作。但是当我已经拥有一个(在我的情况下,预填充时间创建与现有时间重叠的时间跨度)时,即使我将值更改为另一个无效模板,也不会显示错误模板,直到它至少为止一旦有效输入。
我使用调试器遍历验证器,当出现错误时它总是返回无效结果。此外,当值无效时,我无法关闭对话框,ValidTimeSpan
和TimeSpanUnoccupied
正常工作。所以它实际上只是错误模板的显示出错了。我不知道为什么。
此外,只有错误模板才会出现这种情况。当我在Validation.HasError
上绑定工具提示时,即使在窗口打开时错误已经存在,它也会显示工具提示:
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
我做错了什么?我错过了什么?
答案 0 :(得分:0)
如果没有可靠地再现问题的好Minimal, Complete, and Verifiable code example,就不可能确切地知道问题究竟是什么。那说......
我自己也遇到过类似的问题。特别是,当目标属性更改并复制回源时,似乎验证仅发生 。首次初始化控件时不会发生这种情况,因此验证步骤不会发生。
我发现解决此特定问题的方法是在加载控件后通过调用BindingExpression.UpdateSource()
方法强制进行验证。即为Loaded
事件添加处理程序并在那里调用该方法。例如:
private void textBox1_Loaded(object sender, RoutedEventArgs e)
{
TextBox textBox = (TextBox)sender;
BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
}
如果上述内容实际上无法解决您的问题,请通过提供可靠地重现问题的良好MCVE来改善您的问题。或者,请查看此处的问题:Initial validation on dynamically added control。在该问题中,验证本身并不是问题,而是更新提供用户关于验证失败的反馈的装饰器。目前您的问题中没有足够的信息让我能够确定问题的确切位置,但希望这些答案中的一个或另一个有帮助。