Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在选择时使用动态内容填充WPF列表框子项_Wpf_Listbox_Wpf Controls - Fatal编程技术网

在选择时使用动态内容填充WPF列表框子项

在选择时使用动态内容填充WPF列表框子项,wpf,listbox,wpf-controls,Wpf,Listbox,Wpf Controls,我正在尝试实现一个UI场景。它用于表示目录,是一个树状结构,包含主章、子章、子章等 类表示更像 MainChapters Name Prop1 Prop2 List<SubInfo> SubInfo List<Pages> Pages Name List<MediaElements> List<SubInfo> MediaElement Name Type 主要章节 名称 建议1 建议2 列表

我正在尝试实现一个UI场景。它用于表示目录,是一个树状结构,包含主章、子章、子章等 类表示更像

MainChapters
 Name 
 Prop1
 Prop2
 List<SubInfo>

SubInfo 
 List<Pages>

Pages
  Name  
  List<MediaElements>
  List<SubInfo>

MediaElement 
   Name 
   Type
主要章节
名称
建议1
建议2
列表
子信息
列表
页
名称
列表
列表
媒体元素
名称
类型
我计划实现的UI是将MainChapters绑定到listbox,一旦选择了listbox中的特定项,我计划将子信息作为子项绑定到listbox 设计要求如所附图片所示 ![预期用户界面的示例结构][1]


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

下面是一个示例,在这个示例中,我使用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>

子数据

这可以通过调整列表框的项目模板来实现,因此如果您可以共享相同的模板,我可以尝试为您调整。我需要用于子内容的常规数据模板或列表项和数据模板/控件。我们是否可以向Itemtemplate添加动态级别,如您所见,MainChapter的页面可能包含子信息(即子章)和任何级别的子页面?我们是否可以显示或隐藏aListbox的Itemtemplate?您可以具有动态级别,但是在你的情况下,隐藏和显示一个特定的触发器,比如IsSelected,是一个不错的选择。当你在模板中绑定子项时,它将递归,并将成为dynamicI。如果没有达到预期的结果,它将在基本级别上工作,并共享代码。完成了示例,对我来说非常有吸引力。只面临一个问题和它的滚动。我无法滚动子数据。当我滚动它消失时,我认为问题在于StackPanel,因为StackPanel中的高度不是固定的,所以也许您可以定义一个
MaxHeight=“100”
内部列表框,看看它是否是您要找的,100只是一个您可以选择的数字。同时在两个列表框上设置
ScrollViewer.CanContentScroll=“False”
,以便更平滑地滚动,我想这在您的情况下是非常必要的。是的,这就成功了。它起作用了。。如果我能再做一件事,我想我的要求已经完成了。我需要的是,如果我第二次单击标题(第一次它展开…),我可以将Isselected属性设置为False吗?如果用户再次单击,我认为您可以使用事件触发器,这可以通过将属性设置为False或将可见性设置为collapsed来实现,因为它是绑定的,所以它也会将值向后推。我也可以试着准备一些样品,同时你也可以试一下。更新了我的答案,让切换只在简单绑定下工作