Как показать WPF ValidationResult в отдельном текстовом блоке? - PullRequest
0 голосов
/ 19 января 2010

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

       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, который теперь, в случае ошибки, говорит просто: "есть ошибка"?

Ответы [ 2 ]

4 голосов
/ 19 января 2010

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

<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>

Работает нормально

0 голосов
/ 18 сентября 2013

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>

...