WPF更新边框样式BlockText触发器

时间:2017-05-26 17:24:40

标签: c# wpf xaml data-binding app.xaml

是否可以使用TextBox中的触发器更新父边框是否有效?我试过使用数据模板方法。我无法使用它,因为我试图在数据上下文中传递两个属性。一个用于占位符,另一个用于绑定User.Email。

如果存在更好的方法来实现这一成就,我开始使用WPF。 我也试过用这种方法。创建了一个ControlTemplate并使用ScrollViewer x:Name="PART_ContentHost",但样式不会更新。

关键是如何能够以更有效的方式保持绑定并更新父边界?

在视图中:

<Border Style="{DynamicResource TextBoxBorderStyle}" >
    <Grid>
        <TextBlock Text="{Binding Path=UserPlaceholder}"
                                   Style="{StaticResource PlaceHolderTextStyle}">
            <TextBlock.Visibility>
                <MultiBinding Converter="{StaticResource textInputToVisibilityConverter}">
                    <Binding ElementName="Email" Path="Text.IsEmpty" />
                    <Binding ElementName="Email" Path="IsFocused" />
                </MultiBinding>
            </TextBlock.Visibility>
        </TextBlock>
        <TextBox Name="Email" 
            Background="Transparent" 
            Style="{StaticResource textBoxBase}"
            Text="{Binding Path=UserCredentials.Email,
            Mode=TwoWay,
            TargetNullValue='',
            ValidatesOnDataErrors=True,
            UpdateSourceTrigger=PropertyChanged}">
        </TextBox>
    </Grid>
</Border>

在App边框样式中:

<Style x:Key="TextBoxBorderStyle"
        TargetType="{x:Type Border}">
    <Setter Property="BorderBrush"
            Value="{DynamicResource TextBoxBorderBrush}"/>
    <Setter Property="Background"
            Value="{StaticResource TextBoxBackgroundBrush}"/>
    <Setter Property="HorizontalAlignment"
            Value="Stretch"/>
    <Setter Property="VerticalAlignment"
            Value="Center"/>
    <Setter Property="BorderThickness"
            Value="2"/>
    <Setter Property="CornerRadius"
            Value="{StaticResource DefaultBorder}"/>
    <Setter Property="Height"
            Value="50"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBox}}, Path=Validation.HasError}" Value="True">
            <Setter Property="BorderBrush"
                Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

在App Textblock Style中:

<Style x:Key="textBoxBase" TargetType="{x:Type TextBox}">
    <Setter Property="HorizontalAlignment"
            Value="Stretch"/>
    <Setter Property="VerticalAlignment"
            Value="Center"/>
    <Setter Property="Foreground"
            Value="{StaticResource TextBoxForegroundBrush}"/>
    <Setter Property="FontSize"
            Value="16"/>
    <Setter Property="Margin"
            Value="{StaticResource DefaultMargin}"/>
    <Setter Property="FontFamily"
            Value="{StaticResource DefaultFontFamily}"/>
    <Setter Property="BorderThickness"
            Value="0"/>
</Style>

1 个答案:

答案 0 :(得分:0)

要在控件中显示一些错误元素,您需要使用Validation.ErrorTemplate附加属性。您可能会发现this帖子很有用,或者查看MahApps.Metro中的error template