使一组 WPF 扩展器专门“扩展”,即一次仅扩展一个

问题描述 投票:0回答:3

我有一个包含一组“Expander”项目的列表框,我想做的是使每个项目的

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
或扩展器,哎呀 - 如果需要更改,我不依赖于任何它。

c# wpf data-binding listbox expander
3个回答
7
投票

什么决定

Expander
是否展开?如果是选择,您可以将
IsExpanded
属性绑定到
IsSelected
ListBoxItem
属性:

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

0
投票

这个手风琴控件也许是您正在寻找的


0
投票

由于肯特·布加特(Kent Boogaart)的回答对我不起作用,我确实喜欢这样:

注意:我正在使用 XAML Material Design,也许这就是它不起作用的原因

<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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.