为什么 DataTemplate 的 Trigger 的 Setter.TargetName 属性找不到带有 Property="Background" 的目标,但可以用 Property="Panel.Background"

问题描述

我正在为 ListBox 的 ItemTemplate 实现一个模板,但我有一个非常简单的编译错误,但我无法弄清楚其背后的原因是什么。我想知道为什么 private void loadrewardedvideoad() { RewardedAd.loadAd(getString(R.string.reward),new AdRequest.Builder().build()); } @Override public void onRewarded(RewardItem rewardItem) { //ProcessRewardedItem and then reload loadrewardedvideoad(); } Property="Panel.Background" 之间存在这种差异。第一个变体没有错误并且编译良好,而后者产生编译错误

错误 MC4111 找不到触发器目标“ContentBorder”。 (目标必须出现在任何使用它的 Setter、触发器或条件之前。)

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

对不起,如果这个问题已经在别处回答了;我进行了研究,但没有找到与我想出的这个问题和结果相关的任何答案。

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

Property="Panel.Background"

解决方法

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

    <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。