如何在代码中设置验证错误模板(Validation.ErrorTemplate)?

3

我在 StackOverflow 上查找了一些相关问题,但它们都不起作用。

我有一个名为 PasswordBox 的控件:

<PasswordBox Width="160"
      HorizontalAlignment="Left"
      Margin="10,3"
      Name="textBoxUserPass"
      local:PasswordBoxAssistant.BindPassword="True"
      local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password, UpdateSourceTrigger=Explicit, 
      ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"
      Validation.ErrorTemplate="{x:Null}" />

我首先设置了ValidationErrorTemplate="{x:Null}",这样第一次加载PasswordBox时就不会尝试验证该框。

当我发现错误时,我尝试更改Validation.ErrorTemplate,以便显示红色边框(就像我定义的ErrorTemplate):

BindingExpression bePassword = textBoxUserPass.GetBindingExpression(PasswordBoxAssistant.BoundPassword);
if (bePassword != null)
{
    bePassword.UpdateSource();
    if (bePassword.HasError)
    {
        var validationError = new ValidationError(new ExceptionValidationRule(), bePassword);
        Validation.MarkInvalid(bePassword, validationError);
        validationError.ErrorContent = Cultures.Resources.MessageNoPassword;
        var b = Resources["validationTemplate"] as ControlTemplate;
        Validation.SetErrorTemplate(textBoxUserPass, b);
        }
    }
}

我在 ResourceDictionary.xaml 中定义了我的 validationTemplate,如下所示:

    <Style x:Key="validationTemplate" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" 
                    Foreground="Red"
                    FontSize="12pt">
                    *
                    </TextBlock>
                    <Border BorderBrush="Red" BorderThickness="1" CornerRadius="5">
                        <AdornedElementPlaceholder />
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

一个普通的盒子,如您所见。

我的问题在于尝试寻找这个资源并在代码中更改Validation.ErrorTemplate。我设置了一个断点,这一行:

var b = FindResource("validationTemplate") as ControlTemplate;

提示 b 为 null。我该如何找到"validationTemplate"并使用它?

1个回答

4

你的验证模板是一个带有模板的样式Style。尝试仅使用模板Template:

<ControlTemplate x:Key="validationTemplate">
    <DockPanel LastChildFill="True">
        <TextBlock DockPanel.Dock="Right" 
        Foreground="Red"
        FontSize="12pt">
        *
        </TextBlock>
        <Border BorderBrush="Red" BorderThickness="1" CornerRadius="5">
            <AdornedElementPlaceholder />
        </Border>
    </DockPanel>
</ControlTemplate>

实际上我用了这一行代码解决了它: var template = FindResource("validationTemplate") as ControlTemplate; Validation.SetErrorTemplate(textBoxUserPass, template); - Sonhja
那么 FindResource 似乎比我想象的更聪明,因为它会为您执行强制转换。 - LPL
但是如果没有你的评论,我就不会解决我的问题,所以我认为是你解决了我的问题。我会将你的答案标记为最佳,并编辑我的帖子以适应未来的用户 ;) - Sonhja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接