为什么 DataTemplate 的触发器的 Setter.TargetName 属性 找不到 属性="Background" 的目标,但可以 属性="Panel.Background"

Why DataTemplate's Trigger's Setter.TargetName property cannot find target with Property="Background", but can with Property="Panel.Background"

我正在为 ListBox 的 ItemTemplate 实现一个模板,我有一个非常简单的编译错误,但我无法弄清楚它背后的原因。我想知道为什么 Property="Panel.Background"Property="Background" 之间会有这种差异。第一个变体没有给出错误并且编译良好,而后者产生编译错误:

Error MC4111 Cannot find the Trigger target 'ContentBorder'. (The target must appear before any Setters, Triggers, or Conditions that use it.)

为什么DataTemplate 的Trigger 的Setter.TargetName 属性 无法通过Property="Background" 找到目标,但可以通过Property="Panel.Background" 找到目标?我没有更改触发器在 VisualTree 中的位置(如:我没有将触发器进一步向下移动到树中)。

抱歉,如果这个问题已经在其他地方得到了回答;我做了我的研究,但没有找到任何与我提出的问题和结果具体相关的答案。

下面是重现此案例的完整XAML。

            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel  />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" TargetName="ContentBorder" Value="DarkTurquoise" />
                        </Trigger>
                    </DataTemplate.Triggers>
                    <Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                                <GradientStop Offset="0" Color="Gray"/>
                                <GradientStop Offset="1" Color="Black"/>
                            </LinearGradientBrush>
                        </Border.Background>
                        <Border.BorderBrush>
                            <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                                <GradientStop Offset="0" Color="Black"/>
                                <GradientStop Offset="1" Color="Gray"/>
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        <Grid>
                            <Grid.Resources>
                                <ResourceDictionary>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="Margin" Value="3" />
                                        <Setter Property="Foreground" Value="White"/>
                                    </Style>
                                </ResourceDictionary>
                            </Grid.Resources>
                        
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>
                        
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" SharedSizeGroup="Items" />
                                <ColumnDefinition Width="*" SharedSizeGroup="Items" />
                            </Grid.ColumnDefinitions>

                            <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding StartTime, StringFormat={}Start time: {0:dd.MM.yyyy hh:mm:ss}}" />
                            <TextBlock
                                Grid.Row="0" Grid.Column="1" Text="{Binding SportTypeId, Converter={x:Static Converters:SportTypeCodeToTextConverter.Instance}}"
                                FontWeight="Bold" />
                            <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Distance, StringFormat={}Distance: {0}}" />
                            <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Duration, StringFormat={}Duration: {0:hh\:mm\:ss}}" />
                        </Grid>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>```

据我所知,指定模板及其触发器的顺序很重要。 试试这个:

    <DataTemplate>
        <Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
            <!--Filling in the template-->
        </Border>
        <DataTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="DarkTurquoise" TargetName="ContentBorder"/>
            </Trigger>
        </DataTemplate.Triggers>
    </DataTemplate>

为了以防万一,Border 从 Control 继承了 Background。
因此,属性的全称是Control.Background,而不是Panel.Background。