设定者目标名称无法识别

时间:2016-07-01 16:13:40

标签: c# wpf

我是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>

那么问题是什么?标签被定义为更高的一些线。

2 个答案:

答案 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元素以设置该默认值