2009-07-29 48 views
3

我有一个UserControl包含其他控件和TextBox。它有一个Value属性,它绑定到TextBox文本并且ValidatesOnDataErrors设置为True。在WPF中的不同控件上显示验证错误模板

Value属性绑定中发生验证错误时,错误模板(标准红色边框)显示在整个UserControl的周围。

有没有办法仅在TextBox附近展示? 我想能够使用任何错误模板,所以简单地将文本框放在边框上,并绑定它的颜色或Validation.HasError不是一个选项。

这里是我的代码:

<DataTemplate x:Key="TextFieldDataTemplate"> 
    <c:TextField DisplayName="{Binding Name}" Value="{Binding Value, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
</DataTemplate> 

<controls:FieldBase x:Name="root"> 
<DockPanel DataContext="{Binding ElementName=root}"> 
    <TextBlock Text="{Binding DisplayName}"/> 
    <TextBox x:Name="txtBox"     
      Text="{Binding Value, Mode=TwoWay, ValidatesOnDataErrors=True}" 
      IsReadOnly="{Binding IsReadOnly}"/> 
</DockPanel> 

用户控件(FieldBase)比绑定到模型视图执行验证。

回答

2

要完成此任务我已使用此解决方案。它使用转换器,通过将(Validation.Errors).CurrentItem转换为Thickness来“隐藏”边界。

<Grid> 
    <Grid.Resources> 
     <data:ValidationBorderConverter 
      x:Key="ValidationBorderConverter" /> 
    </Grid.Resources> 
    <Border 
     BorderBrush="#ff0000" 
     BorderThickness="{Binding 
      ElementName=myControl, 
      Path=(Validation.Errors).CurrentItem, 
      onverter={StaticResource ValidationBorderConverter}}"> 
     <TextBox 
      ToolTip="{Binding 
       ElementName=myControl, 
       Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
    </Border> 
</Grid> 

ValidationBorderConverter类是非常简单的:

[ValueConversion(typeof(object), typeof(ValidationError))] 
public sealed class ValidationBorderConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     return (value == null) ? new Thickness(0) : new Thickness(1); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}