UserControl中的验证文本框

时间:2012-10-28 17:49:46

标签: wpf validation user-controls textbox adornerdecorator

我创建了一个UserControl - 一个标签TextBox,除了验证模板外,它运行良好。当出现错误时,验证控件模板会显示,但它会填充整个空间,包括Label。我只希望它和TextBox一样大。如何解决这个问题?

这是xaml:

<UserControl x:Class="Infrastructure.CustomControls.LabelTextBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="LTB">

    <Grid HorizontalAlignment="{Binding}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock x:Name="tbl" 
                   FontFamily="{Binding}" 
                   FontSize="{Binding}" 
                   Text="{Binding ElementName=LTB, Path=LabelText}" 
                   Height="{Binding ElementName=LTB, Path=LabelHeight}" 
                   Width="{Binding ElementName=LTB, Path=LabelWidth}" 
                   VerticalAlignment="Center"/>
        <TextBox x:Name="tbx" 
                 Grid.Column="1" 
                 FontFamily="{Binding}" 
                 FontSize="{Binding}" 
                 IsReadOnly="{Binding ElementName=LTB, Path=IsReadOnly}" 
                 MaxLength="{Binding ElementName=LTB, Path=TextMaxLength}" 
                 Text="{Binding ElementName=LTB, Path=Text}" 
                 Height="{Binding ElementName=LTB, Path=TextHeight}"
                 Width="{Binding ElementName=LTB, Path=TextWidth}" 
                 VerticalAlignment="Center">
            <Validation.ErrorTemplate>
                <ControlTemplate>
                    <DockPanel LastChildFill="True" 
                               ToolTip="{Binding ElementName=aep, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                        <TextBlock DockPanel.Dock="Right" 
                                   Foreground="Red" 
                                   FontSize="14pt" Text="*" 
                                   Margin="-15,0,0,0" 
                                   FontWeight="Bold"/>
                        <Border BorderBrush="Red" BorderThickness="1">
                            <AdornedElementPlaceholder Name="aep"/>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Validation.ErrorTemplate>
        </TextBox>
    </Grid>
</UserControl>

2 个答案:

答案 0 :(得分:1)

发生这种情况的原因是您在视图中实现IDataErrorInfo而不是UserControl。这会导致默认 WPF红色边框出现在整个用户控件中。

要显示已定义的错误模板,您需要在usercontrol中实现IDataErrorInfo并将ValidatesOnDataErrors=True添加到绑定表达式。

如果您想在视图中保留IDataErrorInfo逻辑而不在UserControl中(这是非常合理的),您需要在视图中为用户控件定义验证模板: / p>

<Window>
    <local:UserControl>
        <Validation.ErrorTemplate>
            <ControlTemplate>
                ...
            </ControlTemplate>
        </Validation.ErrorTemplate>
    </local:UserControl>
</Window>

要使其仅显示TextBox的边框,您可以使用转换器来播放边框的宽度,该转换器将整个usercontrol的宽度作为参数并返回文本框的宽度;可能是这样的:

<Border BorderBrush="Red" BorderThickness="1" Width="{Binding ElementName=ph, Path=ActualWidth, Converter={StaticResource myConverter}}">
    <AdornedElementPlaceholder Name="ph" />
</Border>

答案 1 :(得分:0)

感谢您的回复,它帮助我找出问题所在。为此我投票认为它很有用。

我所做的是以编程方式查询UserControl验证TextBoxChangedEvent中的错误,并为TextBox手动设置验证错误(http://wpftutorial.net/ValidationErrorByCode.html)。