DataTmpger for DataTemplate内部控件的可见性不起作用

时间:2015-12-11 16:25:36

标签: wpf xaml datatrigger

我有一个ListBox绑定到List,它有一个DataTemplate用于它的项目。除了第二个TextBlock的可见性之外,DataTemplate中的所有内容都能正常工作!我不明白我做错了什么,我不想使用转换器,我已经检查了这些链接:

Bind Bool to Visibility of TextBlock within a ListBox

Binding a Button's visibility to a bool value in ViewModel

<ListBox Name="lsb_Jobs" Grid.Column="3" Grid.Row="2" Grid.RowSpan="6" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                     BorderThickness="0,1,0,0" Padding="0,5" Margin="0,10,5,5">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Height="45">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="25"/>
                                <ColumnDefinition Width="250"/>
                                <ColumnDefinition Width="100"/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <Grid.Style>
                                <Style TargetType="Grid">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Importance}" Value="0">
                                            <Setter Property="Background" Value="LimeGreen"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Importance}" Value=".25">
                                            <Setter Property="Background" Value="NavajoWhite"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Importance}" Value=".5">
                                            <Setter Property="Background" Value="Gold"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Importance}" Value=".75">
                                            <Setter Property="Background" Value="Orange"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding Importance}" Value="1">
                                            <Setter Property="Background" Value="OrangeRed"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Grid.Style>
                            <CheckBox Name="chb_IsDone" IsChecked="{Binding Done}" FlowDirection="LeftToRight" Checked="job_Done_Checked" Unchecked="job_Done_Checked"/>
                            <TextBlock Text="{Binding Subject}" Grid.Column="1" Foreground="Black" VerticalAlignment="Center" FontSize="14"/>
                            <TextBlock Text="Done" Grid.Column="3" HorizontalAlignment="Right" VerticalAlignment="Center" Visibility="Hidden" Margin="0,0,170,0">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Done}" Value="True">
                                                <Setter Property="Visibility" Value="Visible"/>
                                            </DataTrigger>  
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

你能告诉我为什么它不起作用吗?!我做了与其他控件完全相同的事情!他们工作,但TextBlock不可见! TextBlock的Visibility属性有问题吗?我已经尝试过FrameworkElement.Visibility,但这不起作用

1 个答案:

答案 0 :(得分:9)

您在TextBlock上明确设置的Visibility="Hidden"将覆盖Style所做的任何事情。首先应用样式,然后最终应用标记属性中的显式赋值。这是有道理的:如果您具有全局TextBlock样式并且在单个TextBlock上设置属性,则希望覆盖这些属性的全局值。

您可能认为触发器稍后会在创建元素并设置属性后应用Setters,因此它们应该明确地覆盖任何设置。但这不是它的工作方式。我不会对这是否应该是&#34;它应该如何&#34;或不。我可以看到双方。但是直到我习惯了它,它的工作方式对我来说并不直观。

不是将默认可见性应用为属性,而是将其应用于样式中的Setter。触发器的Setter不能覆盖设置相同属性的属性,但它可以覆盖不同的Setter。

它应该是这样的:

<TextBlock Text="Done" Grid.Column="3" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,170,0">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Hidden" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Done}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

您的网格在<Grid...标记上没有设置背景画笔。如果确实如此,我预计这些触发器也会失败。