1

我创建了一个 UserControl - 一个TextBox工作得很好的 Labeled,除了验证模板。当出现错误时,验证控制模板会显示出来,但它会填满包括标签在内的整个空间。我只希望它和TextBox. 如何解决这个问题?

这是xml:

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

2 回答 2

1

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

要让您定义的错误模板出现,您需要IDataErrorInfo在您的用户控件中实现并添加ValidatesOnDataErrors=True到您的绑定表达式。

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

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

要让它只显示文本框的边框,您可以使用一个转换器来处理边框的宽度,该转换器将整个用户控件的宽度作为参数并返回文本框的宽度;可能是这样的:

<Border BorderBrush="Red" BorderThickness="1" Width="{Binding ElementName=ph, Path=ActualWidth, Converter={StaticResource myConverter}}">
    <AdornedElementPlaceholder Name="ph" />
</Border>
于 2012-10-28T21:51:57.747 回答
0

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

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

于 2012-10-31T16:14:33.880 回答