Validation.ErrorTemplate仅在至少一次没有错误时可见

时间:2016-04-04 14:11:24

标签: c# wpf validation xaml mahapps.metro

我有两个来自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;
    }
}

只要打开窗口时没有错误,这就可以正常工作。但是当我已经拥有一个(在我的情况下,预填充时间创建与现有时间重叠的时间跨度)时,即使我将值更改为另一个无效模板,也不会显示错误模板,直到它至少为止一旦有效输入。

我使用调试器遍历验证器,当出现错误时它总是返回无效结果。此外,当值无效时,我无法关闭对话框,ValidTimeSpanTimeSpanUnoccupied正常工作。所以它实际上只是错误模板的显示出错了。我不知道为什么。

此外,只有错误模板才会出现这种情况。当我在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>

我做错了什么?我错过了什么?

1 个答案:

答案 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。在该问题中,验证本身并不是问题,而是更新提供用户关于验证失败的反馈的装饰器。目前您的问题中没有足够的信息让我能够确定问题的确切位置,但希望这些答案中的一个或另一个有帮助。