Проверенное текстовое поле в UserControl

Я создал UserControl - помеченный TextBox который работает довольно хорошо, за исключением шаблона проверки. В случае ошибки отображается шаблон элемента управления проверкой, но он заполняет все пространство, включая метку. Я только хочу, чтобы он был таким же большим, как 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 ответа

Решение

Спасибо за ответ, это помогло мне понять, где проблема. И за это я голосую за это как за полезное.

То, что я сделал, было программно запросить проверку UserControl на наличие ошибок в TextBoxChangedEvent и установите ошибку проверки вручную ( http://wpftutorial.net/ValidationErrorByCode.html) для TextBox,

Причина, по которой это происходит, заключается в том, что вы реализуете IDataErrorInfo по вашему мнению, а не ваш UserControl. Это приводит к тому, что красная граница WPF по умолчанию появляется для всего пользовательского контроля.

Чтобы отобразить определенный вами шаблон ошибки, вам нужно реализовать IDataErrorInfo в вашем пользовательском контроле и добавить ValidatesOnDataErrors=True к вашему обязательному выражению.

Если вы хотите сохранить IDataErrorInfo Логика в вашем представлении, а не в вашем UserControl (что вполне разумно), вам необходимо определить шаблон проверки для пользовательского элемента управления в представлении:

<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>
Другие вопросы по тегам