【发布时间】:2016-08-08 16:37:26
【问题描述】:
我想在设计时让示例数据出现在我的 Treeview 中。我的 Treeview 包含嵌套的 Treeviews 和 CollectionViewSources。
我想了解如何显示嵌套的树视图(当前仅显示 3 级节点中的第一个)。
关于树形视图
这是我目前所知道的:
我的树视图包含分层数据(对象状态(例如“Ready”)> 日期(例如“8/8/16”)> 名称(例如“Apples”),但我只能得到一个。
Treeview 支持:
- ObjectTreeviewViewModel(一个 ObservableCollection)
- CollectionViewSource 按 StateDisplay 分组(+排序)
- 另一个按 ObjectDateDisplay 分组的 CollectionViewSource
当前状态
ObjectTreeview 在设计时只显示一级节点,而我期望有 3 级节点。
我的堆栈
我正在使用 Visual Studio 2015 在 .net 4.5 上构建 WPF 应用程序。
代码
XAML
<UserControl x:Class="myproject.app.views.MainWindow.ObjectTreeview"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../resources/MainWindow/ObjectTreeviewResources.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<TreeView x:Name="Treeview"
ItemsSource="{Binding Source={StaticResource ObjectStateCollectionViewSource}, Path=Groups}"
ItemTemplate="{Binding Source={StaticResource ObjectStateTemplate}}">
</TreeView>
</UserControl>
XAML 资源
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pf="clr-namespace:System.ComponentModel;assembly=PresentationFramework"
xmlns:mainWindow="clr-namespace:myproject.app.viewmodels.MainWindow"
mc:Ignorable="d">
<!-- I.e. Level-3 Node (i.e. Leaf nodes) -->
<DataTemplate x:Key="ObjectTreeviewNode">
<TextBlock Text="{Binding ObjectNameDisplay}"/>
</DataTemplate>
<!-- Initial Grouping: Group by object states -->
<CollectionViewSource x:Key="ObjectStateCollectionViewSource"
Source="{Binding Path=ObjectTreeviewViewModel.TreeviewCollection}"
d:DesignSource="{d:DesignData Source=ObjectTreeviewDesignTimeData.xaml}"
>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="StateDisplay"/>
</CollectionViewSource.GroupDescriptions>
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="StateEnum" />
<componentModel:SortDescription PropertyName="ObjectDate" />
<componentModel:SortDescription PropertyName="ObjectNameDisplay" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<!-- I.e. Level-2 Node (i.e. mid-nodes) -->
<HierarchicalDataTemplate x:Key="ObjectDateTemplate">
<TreeView BorderThickness="0">
<TreeViewItem Header="{Binding Path=Name}"
ItemsSource="{Binding Path=Items}"
d:DataContext="{Binding Path=Items}"
ItemTemplate="{StaticResource ResourceKey=ObjectTreeviewNode}"
IsExpanded="True"/>
</TreeView>
</HierarchicalDataTemplate>
<!-- I.e. Level-1 Node (i.e. Root nodes) -->
<HierarchicalDataTemplate x:Key="ObjectStateTemplate" >
<TreeView BorderThickness="0">
<TreeView.Resources>
<!-- Sub-grouping: Group by object dates (This needs to be nested in this Treeview.Resources) -->
<CollectionViewSource x:Key="ObjectDateCollectionViewSource"
Source="{Binding Path=Items}"
d:DesignSource="{Binding Path=Items}"
>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="ObjectDateDisplay"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<!-- [This and all children] Hide the light-grey inactive background -->
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" />
</TreeView.Resources>
<TreeViewItem Header="{Binding Path=Name}"
ItemsSource="{Binding Source={StaticResource ObjectDateCollectionViewSource}, Path=Groups}"
ItemTemplate="{StaticResource ObjectDateTemplate}"
IsExpanded="True"/>
</TreeView>
</HierarchicalDataTemplate>
</ResourceDictionary>
代码隐藏
using System.Windows.Controls;
using myproject.app.viewmodels.MainWindow;
using myproject.lib.enumerations;
namespace myproject.app.views.MainWindow
{
/// <summary>
/// Interaction logic for ObjectTreeview.xaml
/// </summary>
public partial class ObjectTreeview : UserControl
{
public ObjectTreeviewViewModel ObjectTreeviewViewModel { get; private set; } = new ObjectTreeviewViewModel(); // this is a ObservableCollection<ObjectViewModel>
public ObjectTreeview()
{
InitializeComponent();
}
/// <summary>
/// Load object for an objectStateGroup (a set of ObjectStates) into the collection that backs the treeview.
/// </summary>
/// <param name="objectStateGroup">The objectStateGroupsEnum to load.</param>
public void LoadObjectStateGroup(objectStateGroupsEnum objectStateGroup)
{
ObjectTreeviewViewModel.LoadobjectStateGroup(objectStateGroup);
}
}
}
【问题讨论】:
标签: c# .net wpf visual-studio xaml