我创建了一个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>
答案 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)。