2010-01-19 2 views
0

Я пытаюсь использовать в WPF проверочный ввод элементов управления данными с правилами проверки. У меня есть posintValidationRule класс:Как показать WPF ValidationResult в отдельном текстовом блоке?

 public class posintValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     string _strInt = value.ToString(); 
     int _int = -1; 
     if (!Int32.TryParse(_strInt, out _int)) 
      return new ValidationResult(false, "Value must be an integer"); 
     if (_int < 0) 
      return new ValidationResult(false, "Value must be positive"); 
     return new ValidationResult(true, null); 
    } 
} 

В XAML есть также шаблон ошибки стиля:

<Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
      <StackPanel> 
      <Border BorderBrush="Red" BorderThickness="1" > 
       <AdornedElementPlaceholder></AdornedElementPlaceholder> 
      </Border> 
      <TextBlock Text="there is an error"></TextBlock> 
      </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="true"> 
     <Setter 
      Property="ToolTip" 
      Value="{Binding RelativeSource={RelativeSource Self}, 
      Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 

При возникновении ошибки проверки, текст ValidationResult из posintValidationRule класса появляется в подсказке ("Значение должно быть целым числом "и тому подобное).

Как я мог бы иметь такой же текст, показанный в TextBlock от Validation.ErrorTemplate, который теперь, в случае ошибки, говорит просто: «есть ошибка»?

ответ

4

Я нашел решение:

<Style TargetType="{x:Type TextBox}"> 
     <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <StackPanel> 
       <Border BorderBrush="Red" BorderThickness="1" Margin="5,0,5,0" > 
        <AdornedElementPlaceholder Name="MyAdorner" ></AdornedElementPlaceholder> 
       </Border> 
       <TextBlock 
         Margin="5,0,0,0" 
         Foreground="Red" 
         Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"> 
       </TextBlock> 
      </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Он работает OK

0

DataContext является (Validation.Errors), так что вы можете просто сделать:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
      <StackPanel> 
      <Border BorderBrush="Red" BorderThickness="1" Margin="5,0,5,0" > 
       <AdornedElementPlaceholder Name="MyAdorner" ></AdornedElementPlaceholder> 
      </Border> 
      <TextBlock 
        Margin="5,0,0,0" 
        Foreground="Red" 
        Text="{Binding [0].ErrorContent}"> 
      </TextBlock> 
     </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

Смежные вопросы