Sam*_*neh 7 wpf xaml datatrigger
我有一个ListBox绑定到List,它有一个DataTemplate为它的项目.除了第二个TextBlock的可见性之外,DataTemplate中的所有内容都能正常工作!我不明白我做错了什么,我不想使用转换器,我已经检查了这些链接:
将Bool绑定到ListBox中的TextBlock的可见性
将Button的可见性绑定到ViewModel中的bool值
<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>
Run Code Online (Sandbox Code Playgroud)
你能告诉我为什么它不起作用吗?!我做了与其他控件完全相同的事情!他们工作,但TextBlock不可见!TextBlock的Visibility属性有问题吗?我已经尝试过FrameworkElement.Visibility,但这也不起作用
在Visibility="Hidden"你的TextBlock中明确设置是压倒一切的风格一样.首先应用样式,然后最终应用标记属性中的显式赋值.这是有道理的:如果您具有全局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>
Run Code Online (Sandbox Code Playgroud)
您的网格没有在<Grid...标记上设置背景画笔.如果确实如此,我预计这些触发器也会失败.