【发布时间】:2016-04-04 14:11:23
【问题描述】:
我有两个来自 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>
我做错了什么?我错过了什么?
【问题讨论】:
标签: c# wpf validation xaml mahapps.metro