Проверка 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>