如何在XAML中制作未知深度的TreeView WPF和Silverlight

本文关键字:深度 TreeView WPF Silverlight 未知 XAML | 更新日期: 2023-09-27 18:29:30

编码器!

更新

解决方案很简单:确保您读取的属性具有显式getter。Foo{ get; private set; }

我有一个问题:您必须知道的第一件事是:我必须为WPF和Silverlight使用相同的.xaml文件。

我想要一个包含"Employee"类型节点的TreeView。员工可以有员工为其工作,也可以没有。

我有一个列表(集合),可以用作ItemsSource。Employee类包含一个雇员集合:如果没有人为他工作,则为空(非空);如果他是某些人的老板,则为非空。

我发现了一些好例子:http://msdn.microsoft.com/en-us/library/cc165616(v=vs.110).aspxhttp://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx

我有一个"MyTreeView"类,我也可以用于WPF和Silverlight,同样适用于"MyHierarchicalDataTemplate"answers"MyTreeViewItem",所以这里没有问题。

我的资源部分包含以下内容:

<local:MyHierarchicalDataTemplate x:Key="treeTemplate" ItemsSource="{Binding Employees}">
    <StackPanel Orientation="Horizontal">
        <MyControls:MyTreeViewItem Header="{Binding Name}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Width="40" Text="{Binding Age}" />
   <!-- and so on... -->
            </StackPanel>
            <ListBox ItemsSource="{Binding Employees}" />
            <!-- I tried to make it recursive this way. Result: exception or malfunction. -->
            <!--<MyControls:MyTreeView ItemsSource="{Binding Path=Relations}">
            </MyControls:MyTreeView>-->
        </MyControls:MyTreeViewItem>
    </StackPanel>
</local:MyHierarchicalDataTemplate>

员工数据结构:

Big "Boss" John
 -- Fred
 -- George
 -- Harry
 ---- Snape
 ---- Dumbledore
 ------ Alastor
 ------ Hermione
 -- Mark
 -- Steve
 ---- Stewie
 ------ Dad
 -------- Meg
 -------- Death
 ------ Mother
 ------ World

问题:

如何填充TreeView?每个节点和叶的类型为"Employee"记住:最困难的部分是让它在WPF中工作,也在Silverlight中工作。

备注我尝试了DataType="{x:Type local:Employee}"(或类似的),但我的x命名空间似乎不包含x:Type。我似乎不能使用XmlDataProvider。我想尽可能多地保留MVC/MVVC模型。

相关命名空间:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Employee 类的代码隐藏

public class Employee
    {
        public Employee()
        {
            this.StationFromId = "";
            this.StationFromName = "";
            this.StationToId = "";
            this.StationToName = "";
            this.BackGroundColor = Colors.White;
            this.ForeGroundColor = Colors.Black;
        }
        public Employee(string fromStationId, string name, int age, List<Employee> children)
        {
            this.Name = name;
            this.Age = age;
            if (children != null)
            {
                this.Employees = new Collection<Employee>(children);
            }
        }
        public string Name{ get; private set; }
        public int Age{ get; private set; }
        public Color BackGroundColor = Colors.White;
        public Color ForeGroundColor = Colors.Black;
        public Collection<ServiceIntentionRelation> Employees = new Collection<Employee>();
    }

我为所有的东西创建了一个DataContext,这是使用的。

public class EmployeeDataContext
    {
        public EmployeeDataContext()
        {
            this.Fill();
        }
        public Collection<Employee> Employees = null; // I could use new Collection<Employee>(), does not matter (theoretically)
        private void Fill()
        {
            var e1 = new Employee("George", 34, null);
            var e2 = new Employee("Steve", 19, null);
            // e3, e4 and e5 is made the very same way
            var s6 = new Employee("Mike", 56, new List<Employee>(){e3,e4,e5});
            this.Relations = new Collection<ServiceIntentionRelation>() { e1, e2, e6 };
            // e6 has e3, e4, e5 as children.
        }
    }

感谢您的回答

如何在XAML中制作未知深度的TreeView WPF和Silverlight

尝试以这种方式定义分层数据模板。

<local:MyHierarchicalDataTemplate x:Key="treeTemplate" ItemsSource="{Binding Employees}">           
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name}" Margin="0,0,4,0"/>
            <TextBlock Width="40" Text="{Binding Age}" />  
        </StackPanel>
</local:MyHierarchicalDataTemplate>

这将把树视图项目的标题设置为StackPanel中的信息,并把树视图项的ItemsSource设置为Employees。

树视图项的itemscontainer是另一个树视图项,因此当遇到员工时,会使用相同的数据模板创建树视图项。这就是层次结构的创建方式。