C# Validation.ErrorTemplate仅在至少一次无错误时可见

C# Validation.ErrorTemplate仅在至少一次无错误时可见,c#,wpf,validation,xaml,mahapps.metro,C#,Wpf,Validation,Xaml,Mahapps.metro,我有两个来自Xceed WPF Toolkit和use的DateTimePicker,验证错误模板是({DynamicResource ValidationErrorTemplate})。验证使用如下验证属性进行处理: [TimeSpanValidator] public TimeSpan StartTime { get { ... } set { ... } } [TimeSpanValidator] public TimeSpan EndTime { get { .

我有两个来自Xceed WPF Toolkit和use的DateTimePicker,验证错误模板是(
{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
TimeSpanUnoccubied
正常工作。因此,实际上只有错误模板的显示出错。我不知道为什么

此外,这仅在错误模板中发生。当我在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>

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

如果没有一个可靠地再现问题的好方法,就不可能确切地知道问题到底是什么。也就是说

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

我发现解决这个问题的一个办法是在加载控件后通过调用方法强制进行验证。例如,为事件添加一个处理程序并在那里调用方法。例如:

private void textBox1_Loaded(object sender, RoutedEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
}
如果上述事实上没有解决您的问题,请提供可靠再现问题的良好MCVE来改进您的问题。或者,看看这里的问题:。在这个问题上,验证本身并不是问题所在,而是更新提供有关失败验证的用户反馈的装饰器。您的问题中目前没有足够的信息让我能够准确地说出问题所在,但希望这些答案中的一个或另一个会有所帮助。

如果没有可靠地重现问题的好方法,就不可能确切地知道问题到底是什么。也就是说

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

我发现解决这个问题的一个办法是在加载控件后通过调用方法强制进行验证。例如,为事件添加一个处理程序并在那里调用方法。例如:

private void textBox1_Loaded(object sender, RoutedEventArgs e)
{
    TextBox textBox = (TextBox)sender;

    BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
}
如果上述事实上没有解决您的问题,请提供可靠再现问题的良好MCVE来改进您的问题。或者,看看这里的问题:。在这个问题上,验证本身并不是问题所在,而是更新提供有关失败验证的用户反馈的装饰器。你的问题中目前没有足够的信息让我能够说出问题的确切位置,但希望这些答案中的一个会有所帮助