WPF 验证错误模板错误内容工具提示不起作用

WPF Validation ErrorTemplate errorcontent tooltip not working

我不确定我是否遗漏了一些简单的东西。我在想也许绑定需要改变?或者它可能没有正确定位 ErrorContent 的文本框?

我认为值得注意的是,这两个示例都没有产生绑定错误。

如果我在 App.xml 中定义了以下 XAML,当我的字段被验证时,一切看起来都应该正常工作,但工具提示不起作用,因为 ErrorContent 似乎是空白的,如果我将工具提示中的绑定更改为“测试”,则工具提示会显示“测试”。

<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel>
                    <Image
                        Height="24"
                        Margin="-28,0,0,0"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        DockPanel.Dock="Right"
                        Source="/Resources/error-96.png"
                        ToolTip="{Binding /ErrorContent}" />
                    <AdornedElementPlaceholder />
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果我向同一个 XAML 添加一些触发器来设置边框颜色等,工具提示就会神奇地开始工作,如下所示。

<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border
                    x:Name="border"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    SnapsToDevicePixels="True"
                    UseLayoutRounding="True">
                    <ScrollViewer
                        x:Name="PART_ContentHost"
                        Focusable="false"
                        HorizontalScrollBarVisibility="Hidden"
                        VerticalScrollBarVisibility="Hidden" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="Validation.HasError" Value="True">
                        <Trigger.Setters>
                            <Setter Property="BorderBrush" Value="Red" />
                            <Setter Property="BorderThickness" Value="3" />
                        </Trigger.Setters>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Validation.HasError" Value="false" />
                            <Condition Property="IsMouseOver" Value="true" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter TargetName="border" Property="Opacity" Value="0.56" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel>
                    <Image
                        Height="24"
                        Margin="-28,0,0,0"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        DockPanel.Dock="Right"
                        Source="/Resources/error-96.png"
                        ToolTip="{Binding /ErrorContent}" />
                    <AdornedElementPlaceholder />
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果您想查看用于显示 ErrorTemplate 的文本框绑定。

<TextBox
        Margin="0,2.5,2.5,2.5"
        HorizontalAlignment="Stretch"
        ui:ControlHelper.PlaceholderText="IPv4 Address"
        ui:TextBoxHelper.IsDeleteButtonVisible="False"
        Text="{Binding EditServerModel.IPAddress, ValidatesOnDataErrors=True}" />

我不想使用第二个的主要原因是它替换了 DefaultTextBoxStyle 的模板并破坏了文本框中的占位符文本,以及其他一些特殊功能,我真正 want/need 是显示带有工具提示的错误图像的部分。

编辑: 我正在使用 CommunityToolkit.MvvM。我的模型实现了 ObservableValidator,它实现了 INotifyDataErrorInfo。我模型中的属性使用 DataAnnotation 属性,例如 [Required][RegularExpression]

一个例子:

public class ServerModel : ObservableValidator
{
    private string _iPAddress;
    
    [Required]
    [RegularExpression(@"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$", ErrorMessage = "Not a valid IPv4 address.")]
    public string IPAddress
    {
        get => _iPAddress;
        set
        {
            SetProperty(ref _iPAddress, value);
            ValidateProperty(value);
        }
    }
}

编辑 - 工作答案:

我最终从 ModernWpf 项目中复制了默认样式并删除了 primitives:ValidationHelper.IsTemplateValidationAdornerSite="True",以便我可以使用自己的验证模板。

试试这个绑定:

ToolTip="{Binding [0].ErrorContent}"

如果这不起作用,问题与 DefaultTextBoxStyle.

有关