Wpf 如何在XAML中创建递归ListView

Wpf 如何在XAML中创建递归ListView,wpf,xaml,listview,recursion,Wpf,Xaml,Listview,Recursion,我的模型看起来像 public class MyVm { public string MyTitle { get; set; } public List<MyVm> Children { get; set; } public MyVm() { this.Children = new List<MyVm>(); } } 最后,主窗口视图是 <Grid.Resources> &

我的模型看起来像

public class MyVm 
{
    public string MyTitle { get; set; }
    public List<MyVm> Children { get; set; }

    public MyVm()
    {
        this.Children = new List<MyVm>();
    }
}
最后,主窗口视图是

     <Grid.Resources>
        <Style x:Key="MyStyle" TargetType="ListViewItem">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <HierarchicalDataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding MyTitle}" />
                            <ListView ItemsSource="{Binding Children}" ItemContainerStyle="{Binding MyStyle}" />
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <ListView ItemsSource="{Binding Kids}" ItemContainerStyle="{StaticResource MyStyle}" />


正如您所看到的,我已经尝试对每个“子对象”重复使用相同的资源来实现递归位,但遗憾的是,我看到呈现的唯一内容是一个带有标题2的
文本块
,出于这些目的,您将使用一个(它有自己的
项资源
属性,您将绑定到
子对象
),我不确定
列表框是否支持它。如果不使用
TreeView
,并更改控制模板以删除缩进和折叠切换按钮(如果您不想这样做)。

为此,您将使用(它有自己的
项资源
属性,您将绑定到
子项
),我不确定
列表框
是否支持它。如果不需要,请使用
树状视图
,并更改控制模板以删除缩进和折叠切换按钮(如果不需要)。

修复了它

   <Grid.Resources>
        <DataTemplate DataType="{x:Type a:MyVm}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding MyTitle}" />
                <ListView ItemsSource="{Binding Children}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ContentControl Content="{Binding }" />
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>

    <ListView ItemsSource="{Binding Kids}"  />

修复了它

   <Grid.Resources>
        <DataTemplate DataType="{x:Type a:MyVm}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding MyTitle}" />
                <ListView ItemsSource="{Binding Children}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ContentControl Content="{Binding }" />
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>

    <ListView ItemsSource="{Binding Kids}"  />


只有当其中一个子元素在祖先行中包含元素时,它才是递归的。否则它只是分层的。@H.B….是的,我想我理解这一点,但我不相信我的数据是递归的(正如您所指出的),但我试图在XAML中递归…只有当其中一个子元素在祖先行中包含元素时,它才是递归的。否则它只是分层的。@H.B….是的,我想我理解这一点,但我不相信我的数据是递归的(正如您所指出的),但我正在尝试在XAML中递归…发生完全相同的事情。。。它只显示了一个项目。。。(我更新为TreeView)
HierarchycalDataTemplate
内容应该只是单个项目的表示,不要在其中嵌套额外的
ListBox
或类似内容。父控件必须处理这个问题,这就是关键所在,否则您将被困在下一个级别,因为您无法在其内部引用模板。是的,我没想到
列表框会处理这个问题。我无法将其格式化,但这就是你的意思吗(如果你能读的话:()?
因为这仍然不起作用…您没有绑定
HierarchycalDataTemplate.ItemsSource
。我显然把这件事搞砸了…
但我想我已经了解了这个概念…HierrarchicalDataTemplate将研究绑定元素的所有子元素,如果我们使用DataTemplate,我们可以表示绑定到的属性,发生完全相同的事情…它只显示了1项…(我更新到TreeView)
HierarchycalDataTemplate
内容应该只是单个项目的表示,不要在其中嵌套额外的
ListBox
之类的内容。父控件必须处理好这一点,这就是关键所在,否则您将被困在下一级,因为您无法在其内部引用模板。是的,我没想到
列表框
会处理这个问题。我无法将其格式化,但这就是您的意思吗(如果您可以阅读:()?
因为这仍然不起作用…您没有绑定
HierarchycalDataTemplate.ItemsSource
。我显然把这件事搞砸了…
但是我想我已经理解了这个概念…HierrarchicalDataTemplate将研究绑定元素的所有子元素,如果我们使用DataTemplate,我们可以表达我们绑定的属性。Nice,不知道隐式模板可以绕过循环引用问题。Nice,不知道隐式模板可以围绕循环引用问题。