触发器

时间:2015-08-04 21:41:53

标签: c# wpf validation xaml triggers

我的WPF应用中有一个LabeledTextBox,它很简单:

<Grid x:Name="root">

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0"
               Text="{Binding Label}"
               FontWeight="Bold"
               VerticalAlignment="Bottom"
               Margin="5,2,5,0"/>

    <TextBox Grid.Row="1"
             Text="{Binding Text}"
             VerticalAlignment="Top"
             Margin="5,0,5,2"/>
</Grid>

我将所有模特绑定到那个人展示。我已成功实施IDataErrorInfo,并且可以设置LabeledTextBox样式:

<Style TargetType="controls:LabeledTextBox">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="BorderThickness" Value="5"/>
        </Trigger>
    </Style.Triggers>
</Style>

一切正常,整个控件以红色显示(显然)。我想要的只是操纵TextBox中的LabeledTextBox,我的最终目标是将背景更改为柔和的红色。

如果在整个TextBox上设置触发器,如何从触发器中访问我的LabeledTextbox

我认为这是一个看似简单的任务,我无法正确理解语法。我正在.NET4.0环境中工作,如果这是相关的。

谢谢!

2 个答案:

答案 0 :(得分:1)

您好我不认为我们可以通过样式访问元素但是我们可以通过ControlTemplate.Triggers引用并在Setter中指定TargetName属性。

<Style TargetType="{x:Type wpfApplication4:LabelledTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type wpfApplication4:LabelledTextBox}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock
                            Grid.Row="0"
                            Margin="5,2,5,0"
                            VerticalAlignment="Bottom"
                            FontWeight="Bold"
                            Text="ergergergegr" />

                        <TextBox
                            x:Name="MyTextBox"
                            Grid.Row="1"
                            Margin="5,0,5,2"
                            VerticalAlignment="Top"
                            Text="gtwererggerg" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="MyTextBox" Property="BorderBrush" Value="Red"/>
                            <Setter TargetName="MyTextBox"  Property="BorderThickness" Value="5"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

答案 1 :(得分:0)

  1. 向用户控件添加依赖项属性。
  2. 将您的TextBlock Background属性绑定到该依赖项属性。
  3. 更改触发器中的该属性。