在WPF TreeView中递归绑定

3

我正在尝试递归地绑定TreeView中项的子级。从我在MSDN上看到的HierarchicalDataTemplate是正确的方法,但迄今为止我只成功了一部分。

我的类:

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DocumentText test = new DocumentText();
        this.DataContext = test;

        for (int i = 1; i < 5; i++)
        {
            test.AddChild();
        }
        foreach (DocumentText t in test.Children)
        {
            t.AddChild();
            t.AddChild();
        }
    }
}

partial class DocumentText
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public override string ToString()
    {
        return Name;
    }

    public List<DocumentText> _children;
    public List<DocumentText> Children
    {
        get { return this._children; }
    }

    public DocumentText()
    {
        _name = "Test";
        _children = new List<DocumentText>();
    }

    public void AddChild()
    {
        _children.Add(new DocumentText());
    }
}

我的XAML: 在mainview.xaml中:
    <Window x:Class="treetest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView Name="binderPanel" DockPanel.Dock="Left" 
                      MinWidth="150" MaxWidth="250" Background="LightGray"
                      ItemsSource="{Binding Children}">
        </TreeView>
    </Grid>
</Window>

在 app.xaml 文件中:
    <HierarchicalDataTemplate x:Key="BinderTemplate"
 DataType="{x:Type src:DocumentText}" ItemsSource="{Binding Path=/Children}">
            <TreeViewItem Header="{Binding}"/>
        </HierarchicalDataTemplate>

这段代码生成了第一个子元素的列表,但嵌套的子元素未显示。
1个回答

4

你发布的主要问题是你没有将HierarchicalDataTemplate与TreeView的ItemTemplate连接起来。你需要设置ItemTemplate="{StaticResource BinderTemplate}"或删除x:Key,以将模板应用于所有DocumentText实例。你还应该将模板中的TreeViewItem更改为TextBlock - TreeViewItem是由系统自动生成的,而你在模板中放置的内容将作为HeaderTemplate应用于它。


谢谢!那个方法很管用。我之前也不知道HeaderTemplate。 - Clay
1
我很惊讶你的解决方案能够起作用,因为你的对象没有引发属性或集合变更事件,并且你在填充它们的集合之前就已经将它们绑定了。 - Robert Rossney
@Robert - 我认为它之所以能够保存,是因为绑定在构造函数完成后才开始,而不是在InitializeComponent期间。对于更改通知的需求加1。如果您实现INotifyPropertyChanged并使用ObservableCollection而不是List,将来会节省很多沮丧。 - John Bowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接