ListBox中的WPF扩展器ItemTemplate IsExpanded默认值

时间:2012-06-05 16:48:29

标签: c# wpf wpf-controls

我在ListBox ItemControl.ItemTemplate中有一个Expander。将数据绑定到ListBox后,每个ListItem上的所有Expanders都具有IsExpanded = False。当一个新的ListItem手动添加到ListBox时,我需要将IsExpanded默认设置为true。我的XAML如下:

    <ListBox
    ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
    ScrollViewer.CanContentScroll="False" 
    VirtualizingStackPanel.IsVirtualizing="False" 
    Grid.ColumnSpan="2" 
    HorizontalAlignment="Stretch" 
    Grid.Row="2" 
    Name="ArbitraryDataListbox"
    ItemsSource="{Binding ElementName=CurrentArbitraryDataListControl, Path=CurrentJob.AdditionalData}">
    <ListBox.Resources>
        <Style TargetType="{x:Type Expander}">
            <Setter Property="IsExpanded" Value="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="Beige"/>
            <Setter Property="Foreground" Value="#202020"/>
            <Setter Property="Background" Value="Beige"/>
        </Style>
    </ListBox.Resources>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Expander Header="{Binding Path=Name}" Margin="0,8,0,0" IsExpanded="{Binding RelativeSource={RelativeSource self}, ElementName=ArbitraryDataListbox, Path=}">
                <Controls:ArbitraryDataControl 
                    Width="{Binding ElementName=ArbitraryDataListbox, Path=ActualWidth, Converter={StaticResource SubtractConverter}, ConverterParameter=10}" 
                    CurrentArbitraryData="{Binding}" 
                    CurrentJob="{Binding ElementName=CurrentArbitraryDataListControl, Path=CurrentJob}"/>
            </Expander>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListBox>

我是WPF的新手,无法理解如何在IsExpanded上设置绑定,所以当手动打开新项目时它是真的。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

如果我理解您的代码,那么您现在已经扩展了ListBox的SelectedItem并且其他项目已折叠。如果所选项目发生更改,则旧选定项目将折叠,新选定项目将展开。

如果您希望能够将项目添加到集合中然后选择它,则应考虑使用ListCollectionView。

ListCollectionView包装您的内部集合并公开“CurrentItem”。您可以轻松地将此类绑定到ListBox,这将允许您在添加它之后调用ListCollectionView.MoveCurrentTo(object)来选择对象。