Hallo Stackoverflow fellas!
在我最近的wpf应用程序构建中,我遇到了一个奇怪的行为:
当我在我的应用程序中设置Window类的模板时,每个Validation.ErrorTemplate都不再出现。
所以在我的App.xaml中我定义了以下内容:
<Application.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="WhiteSmoke"/>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="12">*</TextBlock>
<Border BorderBrush="Red" BorderThickness="2" CornerRadius="3">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="PlainStyle" TargetType="{x:Type l:MainWindow}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type l:MainWindow}">
<ContentPresenter Content="{TemplateBinding Content}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
在我的窗口中,我定义了以下内容:
<Window x:Class="ModelItemTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="600"
Width="800"
Style="{StaticResource PlainStyle}">
<TextBox x:Name="Testbox" Text="{Binding Path=TestPerson.Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="100"/>
我将TextBox绑定到这样的类:
public class Person : IDataErrorInfo
{
private string _name;
public string Name { get { return _name; } set { _name = value; } }
public string this[string columnName]
{
get
{
if (columnName.Equals("Name") && !Name.Equals("Martin"))
return "The Value is invalid!!!";
return string.Empty;
}
}
public string Error
{
get { return string.Empty; }
}
}
现在令人惊讶的是,当名称无效但错误模板保持隐藏时,错误的工具提示会显示出来。任何人都能说出这是什么原因,或者是否有解决方法。
答案 0 :(得分:0)
您已从默认的窗口模板中删除了AdornerDecorator,因此没有AdorderLayer来呈现错误装配器。尝试在ControlTemplate中添加一个:
<ControlTemplate TargetType="{x:Type l:MainWindow}">
<AdornerDecorator>
<ContentPresenter Content="{TemplateBinding Content}"/>
</AdornerDecorator>
</ControlTemplate>