标签中的下划线文本位于DataTemplate中

时间:2009-12-11 09:29:47

标签: wpf xaml triggers styles datatemplate

我有一个ListView,其中包含从集合中绑定的对象。我用DataTemplate设置的对象的表示。现在我想做以下事情。 我的TextBlock中有两个DataTemplate

<DataTemplate>
   <StackPanel>
       <TextBlock Text="{Binding Name}"></TextBlock>
       <TextBlock Text="{Binding Path}"></TextBlock>
   </StackPanel>
</DataTemplate>

我已经指定了ItemContainerStyle,用于实现悬停效果。

<Style TargetType="ListViewItem" x:Key="ContainerStyle">
       <Style.Triggers>
                 <EventTrigger RoutedEvent="Mouse.MouseEnter">
  ... and so on

当用户将鼠标移到TextBlock上时,我的目标是为包含名称的ListViewItem加下划线。路径不应加下划线。怎么能实现呢?如何为每个DataTemplate访问ListViewItem中的元素?

问候, 马丁

1 个答案:

答案 0 :(得分:1)

您可以通过为ListViewItem指定ControlTemplate或更改DataTemplate来执行此操作。以下示例显示了这两种方法。请注意,当您使用ControlTemplate时,您将丢失所选ListViewItem的蓝色背景(当您将其注释掉时返回) 编辑: 我没有很好地阅读你的要求。您只想为名称加下划线。然后唯一的可能是使用Datatemplate,或重写TextBox的ControlTemplate。

<Window x:Class="Underlining.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
   >
    <StackPanel>
        <ListView ItemsSource="{Binding}">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListViewItem">
                                <Border Name="UnderlineInControlTemplate" BorderThickness="2,0,2,0"
                                        BorderBrush="Transparent">
                                    <ContentPresenter HorizontalAlignment="Left"
                                                      VerticalAlignment="Center"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter TargetName="UnderlineInControlTemplate"
                                                Property="BorderBrush"
                                                Value="BlueViolet"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                <StackPanel>
                    <Border Name="UnderlineInDataTemplate" BorderThickness="0,0,0,2"
                        BorderBrush="Transparent">
                         <TextBlock Text="{Binding Name}"/>
                    </Border>
                    <TextBlock Text="{Binding Path}"/>
                </StackPanel>
                    <DataTemplate.Triggers>
                        <Trigger Property="TextBlock.IsMouseOver" Value="True">
                            <Setter TargetName="UnderlineInDataTemplate"
                                    Property="BorderBrush"
                                    Value="Red"/>
                        </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</Window>