WPF - App中所有TextBox的自定义ErrorTemplate

时间:2017-06-14 10:50:42

标签: wpf validation controls

我有一个包含许多文本框的表单,每个文本框都需要相同的验证错误模板。 现在,我不想为每个文本框编写这些验证错误模板。那么我必须把它放在哪里,以便所有文本框都受到影响?

带有Validation.ErrorTemplate的文本框:

<TextBox x:Name="textBox3" TextWrapping="Wrap" Height="23" Text="{Binding User_Id, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" VerticalAlignment="Top">
<Validation.ErrorTemplate>
  <ControlTemplate>
    <StackPanel>
      <AdornedElementPlaceholder x:Name="textBox"/>
      <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding ErrorContent}" Foreground="Red"/>
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
    </StackPanel>
  </ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>

我的自定义控件:

 public class ValidationTextBox : TextBox
    {
        static ValidationTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ValidationTextBox), new FrameworkPropertyMetadata(typeof(ValidationTextBox)));
            //Validation.SetErrorTemplate(new ValidationTextBox(), )
        }
        public ValidationTextBox() { }
    }

1 个答案:

答案 0 :(得分:2)

您需要在&#34; Resourse&#34;内定义TextBox的新样式。文本框容器的标签。将为容器内的每个文本框实现此样式。

示例:

<StackPanel>
<StackPanel.Resources>
<Style TargetType=TextBox>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
    <StackPanel>
      <AdornedElementPlaceholder x:Name="textBox"/>
      <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding ErrorContent}" Foreground="Red"/>
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
    </StackPanel>
  </ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources
<TextBox/>
<TextBox/>
<TextBox/>
</StackPanel>