我一直在寻找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为空。我如何找到并使用它?

最佳答案

您的validateTemplate是带有StyleTemplate。仅尝试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>

08-24 19:03