C# 在树视图中动态分组/嵌套平面数据

C# 在树视图中动态分组/嵌套平面数据,c#,wpf,C#,Wpf,我想要一个简单的对象列表,并使用自定义组在树状视图中显示它们 public enum DocumentType { Current, Inactive, Transition, Checkpack, TechLog, Delivery } public enum Status { Approved, Rejected, Pending } public class Document { public string Name { get; set; } public DateTi

我想要一个简单的对象列表,并使用自定义组在树状视图中显示它们

public enum DocumentType { Current, Inactive, Transition, Checkpack, TechLog, Delivery }
public enum Status { Approved, Rejected, Pending }

public class Document
{
    public string Name { get; set; }
    public DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    public DateTime Modified { get; set; }
    public string ModifiedBy { get; set; }
    public DocumentType Type { get; set; }
    public Status Status { get; set; }
}
例如。。。用户可能希望查看此列表,顶级组为“Status”,第二级组为“Name”。这一切都需要从UI进行配置,我正在努力找到实现这一点的最佳方法

我简要地查看了CollectionViewSource对象,但找不到一个好方法让它动态地构建TreeView

我的直觉是我需要在XAML中做一些聪明的模板-这是我所能做到的

<Window.Resources>
    <DataTemplate x:Key="DocumentTemplate">
        <DockPanel>
            <TextBlock Text="{Binding Name}" />
        </DockPanel>
    </DataTemplate>

    <HierarchicalDataTemplate x:Key="GroupTemplate"
                              ItemsSource="{Binding Path=Items}"
                              ItemTemplate="{StaticResource DocumentTemplate}">
        <TextBlock Text="{Binding Path=Name}" />
    </HierarchicalDataTemplate>
</Window.Resources>
<Grid>
    <TreeView ItemsSource="{Binding Documents.View.Groups}"
              ItemTemplate="{StaticResource GroupTemplate}"/>
</Grid>
当然,这只显示顶级组(“CreatedBy”)


在阅读了下面的一个问题后,我终于想出了一个更好的问题


我的问题:是否可以为树视图创建一个通用的HierarchicalDataTemplate,用于显示应用于CollectionViewSource的自定义组。

老实说,这应该在WPF中标记为错误。我也尝试过,发现
Documents.View.Groups
View
属性为空时抛出绑定错误

现在为了使绑定生效,我必须引入一个转换器,它只返回

public class GroupsConverter : IValueConverter
{
    public object Convert(object value, ...)
    {
        return ((CollectionViewSource)value).View.Groups;
    }

    ....
}
树视图绑定是这样更改的

<TreeView x:Name="treeView"                  
          ItemsSource="{Binding Path=Documents,
                                Converter={StaticResource GroupsConverter}}"
          ItemTemplate="{StaticResource GroupTemplate}" />

这对我来说很管用


这对您有帮助吗?

老实说,这应该在WPF中标记为bug。我也尝试过,发现
Documents.View.Groups
View
属性为空时抛出绑定错误

现在为了使绑定生效,我必须引入一个转换器,它只返回

public class GroupsConverter : IValueConverter
{
    public object Convert(object value, ...)
    {
        return ((CollectionViewSource)value).View.Groups;
    }

    ....
}
树视图绑定是这样更改的

<TreeView x:Name="treeView"                  
          ItemsSource="{Binding Path=Documents,
                                Converter={StaticResource GroupsConverter}}"
          ItemTemplate="{StaticResource GroupTemplate}" />

这对我来说很管用


这对你有帮助吗?

嗨,谢谢你的回复。我在绑定到Documents.View.Groups时没有遇到任何问题,因此我无法解释这一点。我的问题是,是否可以将自定义组的通用层次结构模板应用于CollectionViewSource。@Mortick,是的。即使当我拆分
视图
时,我也不再得到绑定错误,但我的树视图是空的。然后,当我通过
转换器获得解决方案时,我的树视图正确加载。如果你能抽出一些时间尝试同样的方法,你也可以让它工作。让我知道上述方法是否有效。嗨,谢谢你的回复。我在绑定到Documents.View.Groups时没有遇到任何问题,因此我无法解释这一点。我的问题是,是否可以将自定义组的通用层次结构模板应用于CollectionViewSource。@Mortick,是的。即使当我拆分
视图
时,我也不再得到绑定错误,但我的树视图是空的。然后,当我通过
转换器获得解决方案时,我的树视图正确加载。如果你能抽出一些时间尝试同样的方法,你也可以让它工作。让我知道上述方法是否有效。
<TreeView x:Name="treeView"                  
          ItemsSource="{Binding Path=Documents,
                                Converter={StaticResource GroupsConverter}}"
          ItemTemplate="{StaticResource GroupTemplate}" />