2015-12-25 3 views
0

Я делаю проверку всех текстовых полей с помощью IDataErrorInfo на моей форме WPF, как это:WPF Проверка с помощью IDataErrorInfo - Как удалить дубликаты Validation.ErrorTemplate

<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 Way. Вы можете переместить ControlTemplate в Ресурсы приложения или окна. И добавьте в textBoxes 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 Way. Если все TextBoxes должны содержать этот ErrorTemplate, вы можете определить TextBox Style в ресурсах и добавить в него ErrorTemplate. Style будет применяться ко всем текстовым полям.

<Style TargetType="TextBox"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       ...    
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Спасибо, но если вы добавляете подтверждение через стиль, как вы предлагаете, я получаю «MyErrorTemplate не может быть разрешен». – pixel

+0

Вы можете добавить 'ControlTemplate' в' Style' setter напрямую, если он используется только в текстовых блоках. Или вы можете переместить 'ControlTemplate' в ресурсы и стиль приложения в ресурсы окна. – bars222

+0

используется только для TextBoxes, и я старался точно так же, как вы указали выше. Ошибки с «« MyErrorTemplate не могут быть решены » – pixel