为什么Validation.ErrorTemplate与WPF中的模板不兼容

时间:2014-08-28 20:43:46

标签: c# wpf validation xaml mvvm

我有TextBox我在MainSkin.xaml Template中定义了ResourceDictionary,如下所示:

<ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBoxBase}">
        <Border x:Name="border" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="ValidationStates">
                    <VisualState x:Name="Valid">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
                                <DiscreteObjectKeyFrame KeyTime="0">
                                    <DiscreteObjectKeyFrame.Value>
                                        <SolidColorBrush Color="#FFABADB3"/>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="InvalidFocused">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
                                <DiscreteObjectKeyFrame KeyTime="0">
                                    <DiscreteObjectKeyFrame.Value>
                                        <SolidColorBrush Color="Red"/>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="InvalidUnfocused">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush)" Storyboard.TargetName="border">
                                <DiscreteObjectKeyFrame KeyTime="0">
                                    <DiscreteObjectKeyFrame.Value>
                                        <SolidColorBrush Color="Red"/>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
            </Trigger>
            <Trigger Property="IsKeyboardFocused" Value="True">
                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

我将Validation.ErrorTemplate属性的模板应用于与TextBox在同一窗口中声明的属性,如下所示:

<Window.Resources>
        <ControlTemplate x:Key="ValidationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" FontSize="20" FontWeight="Bold" Text="!" FontFamily="Segoe UI Light"></TextBlock>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
</Window.Resources>

TextBox设置如下:

<TextBox x:Name="Tb_SnipName" Grid.Row="1" Grid.Column="1" 
             HorizontalAlignment="Stretch" Margin="10,1" 
             VerticalContentAlignment="Center"
             Style="{DynamicResource TextBoxInError}"
             Validation.ErrorTemplate="{StaticResource ValidationTemplate}" 
             Template="{DynamicResource TextBoxBaseControlTemplate}">
        <TextBox.Text>
            <Binding Path="SnipName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                     <helpers:SnipNameRule/>
                </Binding.ValidationRules>
              </Binding>
        </TextBox.Text>
</TextBox>

Validation.ErrorTemplate不起作用,只有在我删除模板调用Template="{DynamicResource TextBoxBaseControlTemplate}"时才有效,我在这里完全错过了什么,不应该在一起吗?有什么可以做的吗?

0 个答案:

没有答案