在选择时使用动态内容填充WPF列表框子项
我正在尝试实现一个UI场景。它用于表示目录,是一个树状结构,包含主章、子章、子章等 类表示更像在选择时使用动态内容填充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 列表
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来实现,因为它是绑定的,所以它也会将值向后推。我也可以试着准备一些样品,同时你也可以试一下。更新了我的答案,让切换只在简单绑定下工作