2012-05-19 16 views
0

我有一个列表视图:WPF。 ListViewItem的变化时的大小选择

<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时,我需要将该高度设置为“自动”。

这可能是触发器可以完成的,但我无法弄清楚。

回答

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

+0

就是这样。谢谢。 – ieaglle

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属性相同的结果。

+0

您的解决方案效果很好,但可以轻松完成。谢谢你! – ieaglle