Проверенное текстовое поле в 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>