验证时向 TextBox 添加警告图标

Add a warning icon to the TextBox when validation

如果出现错误,我想验证文本框。这个想法是,如果出现问题,下一个 TextBox 应该有一个警告图像。

<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}">
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <StackPanel>
                <!-- Placeholder for the TextBox itself -->
                <AdornedElementPlaceholder x:Name="textBox"/>
                <image source="some-Image.png" width="20" Height="20" />
            </StackPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
</TextBox>

但问题是图像没有显示,它只显示图标的边框。 我使用 AdornedElementPlaceholder 正确吗?

发生错误时可以正常工作并显示图像的测试解决方案:

<TextBox BorderThickness="0.8">
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <StackPanel>
                <AdornedElementPlaceholder/>
                <Image Source="Image.jpg" Width="20" Height="20"/>
            </StackPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
    <TextBox.Text>
        <Binding Path="ValidationTest" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnDataErrors="True">
            <Binding.ValidationRules>
                <validation:IntegerValidationRule ValidationStep="CommittedValue" Min="1" Max="99999999"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>  

这里是我在这个例子中使用的验证规则:

public class IntegerValidationRule : ValidationRule
{
    private int _min = int.MinValue;
    private int _max = int.MaxValue;
    private string _fieldName = "Field";
    private string _customMessage = String.Empty;

    public int Min
    {
        get { return _min; }
        set { _min = value; }
    }

    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public string FieldName
    {
        get { return _fieldName; }
        set { _fieldName = value; }
    }

    public string CustomMessage
    {
        get { return _customMessage; }
        set { _customMessage = value; }
    }


    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int num = 0;

        var val = (value as BindingExpression).DataItem;

        if (!int.TryParse(value.ToString(), out num))
            return new ValidationResult(false, $"{FieldName} must contain an integer value.");

        if (num < Min || num > Max)
        {
            if (!String.IsNullOrEmpty(CustomMessage))
                return new ValidationResult(false, CustomMessage);


            return new ValidationResult(false, $"{FieldName} must be between {Min} and {Max}.");
        }

        return new ValidationResult(true, null);
    }
}

这只是 MSDN Docs
中的修改示例 一些注意事项:
您没有提供验证规则,所以我假设它按预期工作并产生有效的验证结果。
您的 TextBox.Text 属性 的绑定不包括验证规则。