如何在Code中设置Validation.ErrorTemplate?

时间:2013-02-27 16:27:52

标签: c# wpf validation passwordbox

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

1 个答案:

答案 0 :(得分:3)

您的validationTemplate是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>