使一个WPF扩展器的集合专门“扩展”,即每次只有一个膨胀

oyt4ldly  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(116)

我有一个包含一组“Expander”项目的ListBox,我想做的是使每个项目的IsExpanded属性都是独占的。例如,如果我在ListBox中有10个扩展器,我希望一次只打开一个。
以下是我到目前为止所做的:

<Window>
    <Window.Resources>
        <DataTemplate x:Key="NormalTemplate">
            <Expander Margin="0" IsExpanded="True" Header="{Binding Model.Name}" Background="Green">
                <Grid>
                    <StackPanel HorizontalAlignment="Stretch">
                        <TextBlock Text="{Binding Model.Description}" TextWrapping="Wrap" HorizontalAlignment="Stretch" Margin="0"/>
                    </StackPanel>
                </Grid>
            </Expander>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <ListBox ItemsSource="{Binding Groups}" 
                 ItemTemplate="{DynamicResource NormalTemplate}"
                 />
    </Grid>
</Window>

有什么办法可以做到这一点吗?我没有绑定到ListBox或扩展器,见鬼-如果需要更改,我没有绑定到任何扩展器。

nhhxz33t

nhhxz33t1#

什么决定Expander是否扩展?如果是selection,你可以将IsExpanded属性绑定到ListBoxItemIsSelected属性:

<Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" ...>
toiithl6

toiithl62#

这个Accordian contro l可能是你正在寻找的

t3psigkw

t3psigkw3#

由于肯特·布加特的回答对我不起作用,我这样做了:
注意:我使用XAML材料设计,也许这是它不工作的原因

<Style TargetType="{x:Type Expander}">
    <EventSetter Event="Loaded" Handler="Expander_Loaded" />
    <EventSetter Event="Expanded" Handler="Expander_Expanded" />
</Style>
private readonly List<Expander> allExpanders = new();

private void Expander_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    allExpanders.Add(sender as Expander);
}

private void Expander_Expanded(object sender, System.Windows.RoutedEventArgs e)
{
    foreach (Expander exp in allExpanders.Where(exp => exp != sender))
    {
        exp.IsExpanded = false;
    }
}

相关问题