在WPF中的其他控件上显示验证错误模板

时间:2009-07-29 06:27:43

标签: wpf validation templates

我有UserControl,其中包含其他控件和TextBox。它具有绑定到Value文本的TextBox属性,并且ValidatesOnDataErrors设置为True。

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>

UserControl(FieldBase)绑定到执行验证的ModelView。

1 个答案:

答案 0 :(得分: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();
    }
}