【问题标题】:Populate a WPF Listbox Child Items with Dynamic content on Selection在选择时使用动态内容填充 WPF 列表框子项
【发布时间】:2014-06-04 05:04:13
【问题描述】:

我正在尝试实现 UI 一个场景。它用于表示目录,一个树视图,如带有 MainChapter 的 structre , Sub chapter , Sub-sub Chapter 等 类表示更像

MainChapters
 Name 
 Prop1
 Prop2
 List<SubInfo>

SubInfo 
 List<Pages>

Pages
  Name  
  List<MediaElements>
  List<SubInfo>

MediaElement 
   Name 
   Type

我计划实现的 UI 是将 MainChapters 绑定到列表框,一旦选择了列表框中的特定项,我计划将 SubInfo 作为子项绑定到列表框 设计要求如附图所示 ![预期 UI 的示例结构][1]

那么我可以将 WPF Listbox 用于上述类型的 UI 实现或任何其他建议或最简单的方法吗?

【问题讨论】:

  • 这个可以通过调整listbox的item模板来实现,如果大家可以分享一下,我可以试着给你调整一下。我需要用于子内容的常规数据模板或列表项和数据模板/控件
  • 我们可以在 Itemtemplate 中添加动态级别吗,如您所见 MainChapter 的页面可能包含 SubInfo 即子章节和任何级别的子页面?
  • 我们也可以显示或隐藏一个Listbox的Itemtemplate吗?
  • 您可以拥有动态级别,但在特定触发器(例如 IsSelected)上隐藏和显示在您的情况下是不错的选择。当您在模板中绑定孩子时,它将递归并变为动态
  • 如果没有达到预期的结果,我将在基础级别上工作并分享代码。

标签: wpf listbox wpf-controls


【解决方案1】:

这是一个示例,在此示例中,我使用 ListBoxItem 的 IsSelected 属性控制子组的可见性

    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Black" BorderThickness=".5" Padding="1">
                    <StackPanel>
                        <TextBlock Text="{Binding}" />
                        <GroupBox Header="child group" MaxHeight="100"
                                  Visibility="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Converter={StaticResource BooleanToVisibilityConverter}}">
                            Child data
                        </GroupBox>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <sys:DateTime />
            <sys:DateTime />
            <sys:DateTime />
        </ListBox.Items>
    </ListBox>

用鼠标点击隐藏子面板

  • 添加了一个切换按钮作为标题
  • 从按钮替换了原始模板以获得所需的外观
  • 将 IsChecked 属性绑定到 ListBoxItem 的 IsSelected
  • 将子面板可见性的绑定修改为更短的语法

就是有一个切换按钮来隐藏子内容

    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Black" BorderThickness=".5" Padding="1">
                    <StackPanel>
                        <ToggleButton x:Name="toggleChild" Content="header text, click to close" 
                                      IsChecked="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}">
                            <ToggleButton.Template>
                                <ControlTemplate TargetType="ToggleButton">
                                    <ContentPresenter />
                                </ControlTemplate>
                            </ToggleButton.Template>
                        </ToggleButton>
                        <GroupBox Header="child group" MaxHeight="100" 
                                  Visibility="{Binding IsChecked, ElementName=toggleChild, Converter={StaticResource BooleanToVisibilityConverter}}">
                            Child data
                        </GroupBox>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <ListItem />
            <ListItem />
            <ListItem />
        </ListBox.Items>
    </ListBox>

【讨论】:

  • 做了样本,对我来说就像一个魅力。只面临一个问题及其滚动。我无法滚动子数据。当我滚动它时,它消失了
  • 我认为问题出在 StackPanel 上,因为 StackPanel 中的高度不是固定的,所以也许你可以定义一个 MaxHeight="100"inner ListBox 看看它是否是你要找的,100只是一个数字,您可以选择。还要在你的两个 ListBoxes 上设置 ScrollViewer.CanContentScroll="False" 以获得更平滑的滚动,我想在你的情况下它是非常需要的。
  • 是的,它成功了。它的工作原理.. 如果我能再做一件事,我想我的要求已经完成了。我需要的是,如果我第二次单击标题(第一次扩展..),我可以将 Isselected 属性设置为 False,如果用户再次单击它应该隐藏
  • 我认为您可以使用事件触发器,这可以通过将属性设置为 false 或将可见性设置为折叠来实现,因为它是绑定的,因此它也会将值推回。我也可以尝试准备一些样品,同时你试一试。
  • 更新了我的答案,让切换只工作简单绑定
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多