Usercontrol样式触发器无法正常工作

时间:2013-10-27 09:19:04

标签: wpf user-controls triggers

我很确定这个问题不时被问到,因为我发现了另一个关于相同内容的问题here。但是当我尝试使用所有这些页面时,我只是卡住了...... 这就是我想要做的。我创建了一个usercontrol来选择一个文件,并在文本框中显示该文件的路径。就像在HTML(输入类型=文件)中一样。这一切都很有效并且符合预期。但是当我尝试使用触发器(FilePathIsValid)更改文本框的颜色时,它只是不起作用。如上所述,依赖属性都可以正常工作。但是样式并没有分配给文本框。 这是我的XAML - 谁能告诉我我做错了什么? (如果需要,代码在here后面)

<UserControl x:Class="Project.Controls.SelectFileBox"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:Controls="clr-namespace:Project.Controls"
         x:Name="ThisUserControl"
         mc:Ignorable="d" d:DesignHeight="30" d:DesignWidth="300">
<UserControl.Resources>
    <!-- This does not work... -->
    <Style TargetType="{x:Type Controls:SelectFileBox}">
        <Style.Triggers>
            <Trigger Property="FilePathIsValid" Value="false">
                <Setter Property="TextBoxBorderColor" Value="red"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <!-- Neither does this: FilePathIsValid can't be found -->
    <Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="FilePathIsValid" Value="false">
                <Setter Property="BorderBrush" Value="red"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="100"/>
    </Grid.ColumnDefinitions>
    <TextBox Grid.Column="0" Margin="3" IsEnabled="{Binding ElementName=ThisUserControl,Path=TextBoxIsEnabled}" Text="{Binding ElementName=ThisUserControl,Path=FilePath}" BorderThickness="{Binding ElementName=ThisUserControl, Path=TextBoxBorderThickness}"/>
    <Button Grid.Column="1" Margin="0,3,3,3" Content="{Binding ElementName=ThisUserControl, Path=ButtonText}" Click="SelectFileClick"/>
</Grid>

2 个答案:

答案 0 :(得分:1)

好的,我在查看代码隐藏后就明白了这个问题。

您需要做的就是在TextBox上为BorderBrush属性添加绑定,如下所示,以便正确使用BorderBrush

BorderBrush="{Binding ElementName=ThisUserControl, Path=TextBoxBorderColor}"

TextBox元素的完整XAML:

<TextBox Grid.Column="0" Margin="3" 
         IsEnabled="{Binding ElementName=ThisUserControl,Path=TextBoxIsEnabled}"
         Text="{Binding ElementName=ThisUserControl,Path=FilePath}" 
         BorderThickness="{Binding ElementName=ThisUserControl, Path=TextBoxBorderThickness}" 
         BorderBrush="{Binding ElementName=ThisUserControl, Path=TextBoxBorderColor}"/>

我试过并测试过,下面是截图

Sample Output

替代方式:

您可以拥有TextBox的样式并使用数据触发器来更改边框画笔:

<Style TargetType="TextBox">
       <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=ThisUserControl, 
                         Path=FilePathIsValid}" Value="False">
                  <Setter Property="BorderBrush" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
</Style>

使用此方法,您不需要SelectFileBox的样式和BorderBrushTextBox属性的绑定。

答案 1 :(得分:0)

如果我理解正确,如果路径无效,则将textBoxbroder设置为红色,然后按以下方式更改代码

<Style TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="FilePathIsValid" Value="false">
            <Setter Property="BorderBrush" Value="red"/>
        </Trigger>
    </Style.Triggers>
</Style>