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



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

错误MC4111找不到触发器目标"ContentBorder"。(目标必须出现在任何使用它的设置程序、触发器或条件之前。(

为什么DataTemplate的触发器的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.

相关内容

最新更新