如何在 WPF 中制作“手风琴小部件”?

dev*_*xer 6 wpf xaml accordion

目标:

我试图在 WPF 中实现这样的目标:

带有多个垂直堆叠扩展器的小部件
(来源:wordpress.org


初步解决方案:

目前,我正在尝试使用ItemsControl具有ItemTemplate的组成Expander

我希望 的Header部分具有一致的外观Expander,但我希望 的Content部分Expander完全灵活。因此,它基本上是一组垂直堆叠的“portlet”,其中每个portlet 具有一致的标题栏但内容不同。


到目前为止的代码:

这就是我目前所拥有的:

<ItemsControl
    Grid.Row="2"
    Grid.Column="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Expander>
                <Expander.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel
                            Orientation="Horizontal">
                            <TextBlock
                                FontSize="14"
                                FontWeight="Bold"
                                Text="Title_Of_Expander_Goes_Here" />
                            <TextBlock
                                Margin="10,0,0,0"
                                FontWeight="Bold"
                                FontSize="18"
                                Text="*" />
                        </StackPanel>
                    </DataTemplate>
                </Expander.HeaderTemplate>
                <Expander.Template>
                    <ControlTemplate
                        TargetType="Expander">
                        <Border
                            BorderThickness="1">
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Expander.Template>
            </Expander>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.Items>
        <StackPanel>
            <TextBlock
                FontSize="14"
                FontWeight="Bold"
                Text="Users:" />
            <wt:DataGrid
                Margin="0,1,0,0"
                AutoGenerateColumns="False"
                CanUserAddRows="True"
                CanUserDeleteRows="True"
                ItemsSource="{Binding Source={StaticResource Main_SystemUsers}, XPath=//Users/*}">
                <wt:DataGrid.Columns>
                    <wt:DataGridTextColumn
                        Header="User Name"
                        Binding="{Binding XPath=@UserName}" />
                    <wt:DataGridComboBoxColumn
                        Header="Role"
                        ItemsSource="{Binding Source={StaticResource Main_UserRoles}, XPath=//Roles/*}"
                        SelectedValueBinding="{Binding XPath=@Role}" />
                </wt:DataGrid.Columns>
            </wt:DataGrid>
            <StackPanel
                Margin="0,10,0,0"
                Orientation="Horizontal">
                <Button
                    Content="Add New User..." />
                <Button
                    Margin="10,0,0,0"
                    Content="Delete User..." />
            </StackPanel>
        </StackPanel>
    </ItemsControl.Items>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

讨论:

当我运行它时,唯一显示的DataGrid是用户及其下方的按钮(“添加新用户”和“删除用户”)。没有Expander或标题栏。此外,即使我确实看到了一个,我也不知道如何为Binding出现在标题栏上的标题设置一个。如果我使用ItemsSource,我知道如何进行绑定,但我想以声明方式设置我的项目。

问题:

我应该怎么做?我正在寻找我现在拥有的修复程序或干净的解决方案。

编辑:

我最终做的是用ItemsControla替换StackPanel并为我的扩展器编写一个样式。事实证明这要简单得多,而且确实没有任何好处,ItemsControl因为无论如何我都需要为每个项目声明自定义内容。剩下的一个问题是如何为每个扩展器实现自定义标题。这就是@Thomas Levesque 建议使用的地方TemplateBinding。我所要做的就是Text="Title_Of_Expander_Goes_Here"在我的标题模板(见上面的代码)中用Text="{TemplateBinding Content}".

Tho*_*que 3

您没有看到 Expander,因为您重新定义了它的模板。这个应该效果更好:

        ...
        <Expander.Template>
          <ControlTemplate
              TargetType="Expander">
              <Border
                  BorderThickness="1">
                  <Expander Content="{TemplateBinding Content}" Header="{TemplateBinding Header}"/>
              </Border>
          </ControlTemplate>
        </Expander.Template>
        ...
Run Code Online (Sandbox Code Playgroud)