2015-12-11 33 views
2

我有一个绑定到List的ListBox,它有一个DataTemplate作为它的项目。除了第二个TextBlock的可见性,DataTemplate中的所有东西都很好用!我不明白我在做什么错了,我不希望使用转换器,我已经检查了这些链接:DataTrigger用于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,但这也不起作用

回答

5

您在TextBlock上显式设置的Visibility="Hidden"正在重写Style所做的任何操作。首先应用样式,然后应用标签属性中的明确分配。这是有道理的:如果你有一个全局的TextBlock风格并且你在一个单独的TextBlock上设置属性,你希望这些属性的全局值被覆盖。

您可能认为触发器在创建元素并设置属性后的某个时间应用Setters,因此它们应该重写显式设置的任何值。但这不是它的工作方式。我对这是否是“应该如何”没有强烈的意见。我可以看到双方。但它的工作方式对我来说并不直观。

将默认可见性作为属性应用,而不是将其应用于样式中的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...标签设置。如果确实如此,我希望这些触发器也会失败。

+1

是的!这就是我要说的:) –