Window.Template杀死任何Validation.ErrorTemplate?

时间:2010-08-13 12:04:08

标签: c# wpf templates

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; }
    }
}

现在令人惊讶的是,当名称无效但错误模板保持隐藏时,错误的工具提示会显示出来。任何人都能说出这是什么原因,或者是否有解决方法。

1 个答案:

答案 0 :(得分:0)

您已从默认的窗口模板中删除了AdornerDecorator,因此没有AdorderLayer来呈现错误装配器。尝试在ControlTemplate中添加一个:

<ControlTemplate TargetType="{x:Type l:MainWindow}">
    <AdornerDecorator>
        <ContentPresenter Content="{TemplateBinding Content}"/>
    </AdornerDecorator>
</ControlTemplate>