如何在XAML中创建递归ListView

时间:2016-07-08 12:31:28

标签: 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>();
    }
}

我希望能够列出所有childrenchildren&#39; children,我认为是递归的。

背后的MainWindow代码是

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        this.Kids = new List<MyVm>();
        var m = new MyVm();
        m.MyTitle = "Title1";
        var m2 = new MyVm();
        m2.MyTitle = "Title2";
        var m3 = new MyVm();
        m3.MyTitle = "Title3";
        var m4 = new MyVm();
        m4.MyTitle = "Title4";

        m.Children.Add(m2);
        m2.Children.Add(m3);
        m3.Children.Add(m4);
        this.Kids.Add(m);
    }

    public List<MyVm> Kids { get; set; }

最后是MainWIndow视图

     <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}" />

正如您所看到的,我已经尝试为每个孩子重复使用相同的资源&#39;实现递归位,但遗憾的是,我唯一看到的是TextBlock Title2

2 个答案:

答案 0 :(得分:1)

出于这些目的,您将使用HierarchicalDataTemplate(它有自己的ItemsSource属性,您将绑定到Children),我不确定ListBox是否支持它。如果您不想使用TreeView并更改控件模板以删除缩进和折叠切换按钮。

答案 1 :(得分:1)

修正了它

   <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}"  />