将验证变成一种风格

时间:2011-10-06 19:42:14

标签: wpf silverlight validation xaml

我在我的viewmodels上使用IDataErrorInfo,并且我有一个样式(下面)用于TextBox,其错误模板工作正常。我知道“ValidatesOnDataErrors = True”使用如下:

<TextBox Text="{Binding Path=LastName, ValidatesOnDataErrors=True}" 
                    Style="{StaticResource TextBoxStyle}" />

将强制WPF使用IDataErrorInfo,但我想知道如何将其融入我的风格。

干杯,
Berryl

<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
    ...

    <!--
    Error handling
    -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               ToolTip="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"/>
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>
    </Style.Triggers>
</Style>

3 个答案:

答案 0 :(得分:3)

如果我理解你的要求,你希望能够在你的风格中使用ValidatesOnDataError=True,这样你就不必每次都重复它。

如果是这种情况你不能,因为这是数据绑定的属性而不是样式;而且你不能模拟数据绑定。

答案 1 :(得分:1)

我只是想知道你是否使用Label而不是TextBox,然后在Label的样式中你可以做这样的事情,

                <ControlTemplate TargetType="sdk:Label">
                    <TextBlock x:Name="textBlock" Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, ValidatesOnDataErrors=True}">

答案 2 :(得分:0)

你不能因为这是对你的财产的绑定定义的一部分,而不是如何可视化错误。