我有一个包含一组“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
或扩展器,哎呀 - 如果需要更改,我不依赖于任何它。
什么决定
Expander
是否展开?如果是选择,您可以将 IsExpanded
属性绑定到 IsSelected
的 ListBoxItem
属性:
<Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" ...>
这个手风琴控件也许是您正在寻找的
由于肯特·布加特(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;
}
}