我是WPF的初学者,我尝试用DataTrigger编写WPF部分。
这里需要的逻辑:
If the variable "iBottleCount" >= 10 then make the background of a label green. If the variable "iBottleCount" < 10 then make the background of a label yellow. If the variable "iBottleCount" = 0 then make the background of a label red.
但他找不到带有名字“StatusColor”的标签。
找到以下代码:
<DataGridTemplateColumn Header="Status" Width="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="StatusText" Height="15" HorizontalAlignment="Left" Margin="2,2,2,2" Text="" VerticalAlignment="Top" Grid.Row="0" Grid.Column="1"/>
<Label x:Name="StatusColor" Content="" Background="green" HorizontalAlignment="Center" Margin="5,5,5,5" VerticalAlignment="Top" Height="10" Width="20" Grid.Row="0" Grid.Column="0"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding iBottleCount}" Value="=>10">
<!-- PROBLEM IS IN THIS LINE -->
<Setter TargetName="StatusColor" Property="Background" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>
那么问题是什么?标签被定义为更高的一些线。
答案 0 :(得分:3)
模板有自己的范围,无法从外部访问。无论如何,您无法在Style触发器中使用TargetName,如果您需要更改Label,请在其Style中添加触发器。
答案 1 :(得分:2)
如果没有一个好的Minimal, Complete, and Verifiable code example能够清楚地表明您正在尝试做什么,那么无法确定最佳解决方案是什么。那说......
首先,H.B.'s answer中的评论是正确的:您正试图访问一个命名元素,其中该名称不在您尝试访问它的位置,和即使可以,Style
触发器也无法使用TargetName
属性。
当然,一种选择是将触发器移动到模板。但是,这需要将模板绑定到您正在使用的视图模型。在您的情况下,这实际上可能没问题。在这个问题上没有足够的背景知道。
如果您更接近现在的设计,触发器采用DataGridCell
样式,您可以使用TemplateBinding
来完成您想要的设计。例如......
在模板中:
<Label Content="" Background="{TemplateBinding Background}" HorizontalAlignment="Center"
Margin="5,5,5,5" VerticalAlignment="Top" Height="10" Width="20"
Grid.Row="0" Grid.Column="0"/>
然后,设置Background
的{{1}}属性将向下传播到模板中。即在你的风格触发器中:
DataGridCell
即。只需从现有代码中删除<Setter Property="Background" Value="Green"/>
属性即可。
显然,仅当您要在模板中设置一个TargetName
值时,此方法才有效。如果你有一个更复杂的场景,你需要更复杂的东西。此外,当然不要忘记,如果要为Background
属性提供默认值,则需要在样式中包含非触发Background
元素以设置该默认值