Проверка WPF с использованием IDataErrorInfo - Как удалить дубликаты Validation.ErrorTemplate

Я делаю проверку всех текстовых полей, используя IDataErrorInfo в моей форме WPF вот так:

<TextBox Name="txtAddress" 
         Validation.Error="Validation_Error"
         Text="{Binding Path=Address, UpdateSourceTrigger=LostFocus, 
                    ValidatesOnDataErrors=True, NotifyOnValidationError=True}">

// If I have many TextBoxes to validate, I have to copy this and paste 
// for each TextBox in XAML.  This obviously violates DRY.  How do I define
// this at one place and use it for all TextBoxes on my form?
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <DockPanel LastChildFill="true">
                <Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="16" Height="16" CornerRadius="10"
                    ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                    <TextBlock Text="!" 
                               VerticalAlignment="center" HorizontalAlignment="center" 
                               FontWeight="Bold" Foreground="white"/>
                </Border>
                <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
                    <Border BorderBrush="red" BorderThickness="1" />
                </AdornedElementPlaceholder>
            </DockPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>

</TextBox>

Это мой метод Validation_Error, использованный выше:

private void Validation_Error(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
        mNumErrors++;
    }
    else
    {
        mNumErrors--;
    }
}

Если в моей форме много текстовых полей, я должен скопировать приведенный выше раздел в каждое определение TextBox в XAML. Как мне определить его в одном месте и использовать для всех текстовых полей?

Спасибо,

1 ответ

1 способ. Вы можете двигаться ControlTemplate Ресурсам приложения или окна. И добавить в текстовые поля StaticResource как это.

ControlTemplate в ресурсах с x:Key имущество.

<ControlTemplate x:Key="MyErrorTemplate">
    <DockPanel LastChildFill="true">
        <Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="16" Height="16" CornerRadius="10"
                                ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
            <TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" 
                                FontWeight="Bold" Foreground="white"/>
        </Border>
        <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
            <Border BorderBrush="red" BorderThickness="5" />
        </AdornedElementPlaceholder>
    </DockPanel>
</ControlTemplate>

TextBox с назначенным ErrorTemplate,

<TextBox Validation.ErrorTemplate="{StaticResource MyErrorTemplate}" />

2 способа. Если все текстовые поля должны содержать это ErrorTemplate Вы можете определить TextBox Style в ресурсах и добавить ErrorTemplate внутрь. Style будет применяться ко всем текстовым полям.

<Style TargetType="TextBox">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                ...             
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Другие вопросы по тегам