2015-12-11 31 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

是的!這就是我要說的:) –