WPF。在选择ListViewItem时更改它的大小

时间:2012-05-19 18:23:28

标签: wpf xaml listview data-binding triggers

我有一个列表视图:

<ListView Name="SelectedFeeds">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}" 
               BasedOn="{StaticResource {x:Type ListViewItem}}">
            <Style.Triggers>
                 <Trigger Property="IsSelected" Value="True">

                 </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Name="panel">
                <TextBlock x:Name="Title" FontSize="24" 
                           Text="{Binding Title, IsAsync=True}" TextWrapping="Wrap" />
                        <Label x:Name="PubDate" FontSize="10" 
                               Content="{Binding Path=PubDate, IsAsync=True}" />
                        <TextBlock my:HtmlParser.HTMLText=
                                   "{Binding Path=Description, IsAsync=True}" 
                                   TextWrapping="Wrap" 
                                   Width="{Binding ElementName=panel, 
                                   Path=ActualWidth}" Height="0" />
             </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

DataTemplate中有一个高度很大的TextBlock。

开始时我将此文本块的高度设置为“0”,当选择ListViewItem时,我需要将该高度设置为“自动”。

这可能是通过触发器完成的,但我无法弄明白。

2 个答案:

答案 0 :(得分:4)

对于触发器方法,请在DataTemplate中使用它。

<ListView Name="SelectedFeeds">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Name="panel">
                <TextBlock x:Name="Title" FontSize="24" 
                           Text="{Binding Title, IsAsync=True}" TextWrapping="Wrap" />
                        <Label x:Name="PubDate" FontSize="10" 
                               Content="{Binding Path=PubDate, IsAsync=True}" />
                        <TextBlock x:Name="TextHolder"
                                   my:HtmlParser.HTMLText=
                                   "{Binding Path=Description, IsAsync=True}" 
                                   TextWrapping="Wrap" 
                                   Width="{Binding ElementName=panel, 
                                   Path=ActualWidth}" Height="0" />
             </StackPanel>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}" Value="True">
                    <Setter TargetName="TextHolder" Property="Height" Value="123"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

请注意x:Name上的TextBlock属性。

答案 1 :(得分:1)

您可以使用触发器执行此操作(虽然我目前不知道如何),但您可以使用转换器执行此操作。

public class BoolToLengthConverter : IValueConverter
{
    public BoolToLengthConverter()
    {
        TrueValue = double.NaN;
        FalseValue = 0;
    }

    [TypeConverter(typeof(LengthConverter))]
    public double TrueValue { get; set; }

    [TypeConverter(typeof(LengthConverter))]
    public double FalseValue { get; set; }

    #region Implementation of IValueConverter

    public object Convert(object value, Type targetType, 
                          object parameter, CultureInfo culture)
    {
        return System.Convert.ToBoolean(value) ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, 
                              object parameter, CultureInfo culture)
    {
        return TrueValue.Equals(value);
    }

    #endregion
}

的Xaml

<ListView.Resources>
    <Converters:BoolToLengthConverter 
         x:Key="BoolToHeightConverter" TrueValue="Auto" FalseValue="0" />        
</ListView.Resources>

<TextBlock ... Height="{Binding Path=IsSelected, 
               Converter={StaticResource BoolToHeightConverter}, 
               RelativeSource={RelativeSource Mode=FindAncestor, 
               AncestorType={x:Type ListViewItem}}}"/>

通过使用BoolToVisibilityConverter并绑定到TextBlock的Visibility属性,您当然可以获得相同的结果。