2012-04-06 38 views

回答

2

您可以为一个TextBox

<Style x:Key="TextBoxWithValidation" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource TextBoxValidationTemplate}"/> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="Background" Value="{StaticResource BackgroundValidationBrush}"/> 
      <Setter 
       Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Mode=Self}, 
       Path=(Validation.Errors)[0].ErrorContent)}" 
      /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

凡BackgroundValidationBrush会说粉红色做这样的事情。

请注意,在没有错误的情况下,ToolTip绑定到(Validation.Errors)[0] .ErrorContent的常见解决方案将导致大量调试问题(技术术语),所以最好使用类似转换器这样的:

[ValueConversion(typeof(ReadOnlyObservableCollection<ValidationError>), typeof(string))] 
public class ValidationErrorsToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     var errors = value as ReadOnlyObservableCollection<ValidationError>; 

     // If there are no errors then return an empty string. 
     // This prevents debug exception messages that result from the usual Xaml of "Path=(Validation.Errors)[0].ErrorContent". 
     // Instead we use "Path=(Validation.Errors), Converter={StaticResource ValidationErrorsConverter}". 
     if (errors == null) 
     { 
      return string.Empty; 
     } 

     var errors2 = errors.Select(e => e.ErrorContent).OfType<string>().ToArray(); 

     return errors.Any() ? string.Join("\n", errors2) : string.Empty; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

和我们可以使用

<converters:ValidationErrorsToStringConverter x:Key="ValidationErrorsConverter"/> 

<!-- Style to be used as the base style for all text boxes --> 
<Style x:Key="TextBoxWithValidation" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource TextBoxValidationTemplate}"/> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="Background" Value="{StaticResource BackgroundValidationBrush}"/> 
      <Setter 
       Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Mode=Self}, 
       Path=(Validation.Errors), 
       Converter={StaticResource ValidationErrorsConverter}}" 
      /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

我只看到传递给我的一个转换器的错误信息,即使一个以上的ViewModel's.GetErrors(“属性名”)存在...想法? – gap 2016-06-23 20:32:32

0

我想你寻找的东西,像

Data Validation

能否使用sniplet:

<Binding.ValidationRules> 
    <DataErrorValidationRule/> 
</Binding.ValidationRules> 

定义的验证规则,并在出现故障的情况下,你会得到一个红色矩形 角落找寻相关的控制。

相关问题