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

Posted

技术标签:

【中文标题】Validation.ErrorTemplate 仅在至少一次没有错误时可见【英文标题】:Validation.ErrorTemplate only visible when at least once no error 【发布时间】: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;
    

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

我使用调试器逐步检查了验证器,当出现错误时它总是返回无效结果。此外,当值无效时,我无法关闭对话框,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】:

如果没有可靠地重现问题的良好Minimal, Complete, and Verifiable code example,就不可能确定问题到底是什么。那就是……

我自己也遇到过类似的问题。特别是,似乎在目标属性更改并复制回源时才发生验证。首次初始化控件时不会发生这种情况,因此不会发生验证步骤。

我发现解决此特定问题的方法是在加载控件后通过调用BindingExpression.UpdateSource() 方法来强制进行验证。 IE。为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。在那个问题中,验证本身不是问题,而是更新为用户提供有关验证失败的反馈的装饰器。目前您的问题中没有足够的信息让我能够准确地判断问题可能出在哪里,但希望这些答案中的一个或另一个会有所帮助。

【讨论】:

以上是关于Validation.ErrorTemplate 仅在至少一次没有错误时可见的主要内容,如果未能解决你的问题,请参考以下文章

WPF 中TextBox 增加输入检测,错误提示