给定ListView
绑定到使用PropertyGroupDescription
分组的项目,是否可以通过编程方式滚动以便将组放置在列表的顶部?我知道我可以滚动到组中的第一项,因为该项属于ListView
绑定到的集合。但是,我找不到任何资源来描述如何滚动到组头(以GroupStyle
样式)。
要给出所需功能的示例,我们来看一下 Visual Studio Code 中的设置页面。该页面由一个面板组成,该面板允许用户滚动应用程序的所有设置(在各自的组下组织)以及左侧的树状结构,以便更快地导航至主面板中的特定组。在所附的屏幕快照中,我单击了左侧树中的 Formatting (格式设置)选项,主面板自动滚动,因此相应的组标题位于主面板的顶部。
如何在WPF中重新创建它(如果可能的话)?使用另一个WPF控件可以模仿 Visual Studio Code 中主设置面板的“无限”滚动吗?
答案 0 :(得分:0)
当然可以。实际设置结构的设计可能有几种变化。它可以是一棵树,其中每个类别标题节点都有自己的子节点,这些子节点代表一个类别的设置;或者是一个平面列表结构,其中类别标题和设置都是同级的。为了简化示例,我选择第二个选项:平面数据结构。
左侧的树(TOC)具有根节点(例如“ TextEditor”部分)。每个部分都包含设置类别(例如“格式设置”)
设置:
ItemsControl
元素:
TreeView
,分为两个级别
ListView
用于实际设置及其类别标题。IData
IHeaderData
ISettingData
TreeView
的父节节点数据类型(根节点)实现一个附加的ISectionData
,其子类型为IHeaderData
TreeView
(仅包含类别)的每个父节节点,一个SectionCollection
类型的ISectionData
CategoryCollection
的{{1}} IHeaderData
类型的SettingCollection
IData
的部分数据实例添加到ISectionData
的源集合SectionCollection
TreeView
的共享类别数据标头实例添加到两个源集合IHeaderData
和CategoryCollection
SettingCollection
类型的设置实例(类别的每个设置一个)添加到ISettingData
SettingCollection
分配给CategoryCollection
根节点的子集合ISectionData
绑定到SectionCollection
TreeView
绑定到SettingsCollection
LIstView
类型为根的HierarchicalDataTemplate
数据创建TreeView
ISectionData
创建两个DataTemplate
ListView
的人IHeaderData
的人逻辑:
ISettingData
的{{1}}项目时,
IHeaderData
在TreeView
中获取相应数据项的项目容器ListView
(以实现视图之外的虚拟化项目)由于var container = ItemsContainerGenerator.GetContainerFromItem(selectedTreeViewCategoryItem)
和container.BringIntoView()
共享相同的类别标题数据(TreeView
),因此所选项目易于跟踪和查找。您无需搜索设置组。您可以使用参考直接跳到该组。
这意味着数据的结构是解决方案的关键。
ListView
我假设在IHeaderData
内部定义了一个PropertyGroupDescription
。设置数据项还具有属性CollectionViewSource
:
ResourceDictionary
找到该部分并将其显示:
SettingsSectionName
您可以将此方法移动到<ResourceDictionary>
<CollectionViewSource x:Key="CollectionViewSource" Source="{Binding Settings}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="SettingsSectionName"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ResourceDictionary>
<ListView x:Name="ListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock FontWeight="Bold"
FontSize="14"
Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
派生类型中。然后将private void ScrollToSection(string sectionName)
{
CollectionViewSource viewSource = FindResource("CollectionViewSource") as CollectionViewSource;
CollectionViewGroup selectedGroupItemData = viewSource
.View
.Groups
.OfType<CollectionViewGroup>()
.FirstOrDefault(group => group.Name.Equals(sectionName));
GroupItem selectedroupItemContainer = this.ListView.ItemContainerGenerator.ContainerFromItem(selectedGroupItemData) as GroupItem;
selectedGroupItemContainer.BringIntoView();
}
添加到处理路由命令的新自定义ListView
中,例如CommandBindings
。将ListView
模板化为ScrollToSectionRoutedCommand
,然后让他们发出命令,将节名称作为TreeViewItems
传递给自定义Button
。